NTM Solutions

Thứ Tư, 3 tháng 8, 2022

ĐỆ QUY DANH MỤC

Trong lập trình, chúng ta hay gặp đi gặp lại 01 vài bài toán kinh điển.

01 trong những bài toán thường gặp trong lập trình web là tạo danh mục nhiều cấp bằng đệ quy.

Ví dụ:

trang web bán hàng thời trang online có 01 menu đa cấp.

Hoặc trang bán hàng có danh mục đa cấp chứa thông tin hàng hóa như sau:

thoitrang

-quan

--jeans

--legging

--congso

-ao

-vay

baiviet

giải thích: trang shop bán hàng có danh mục thời trang bài viết.

trong danh mục thời trang -> chứa 03 danh mục: quần, áo, váy.

Trong danh mục quần -> chứa 03 danh mục: quần jeans, quần legging, quần công sở...


Ở đây mình tạo sẵn 01 cơ sở dữ liệu: shopping

Và tạo bảng categories có nội dung như sau:

Các bạn chú ý 02 cột idparent_id.

Cột parent_id của Category dùng để xác định cha của Category đó.

Ví dụ:

Chúng ta có 03 Category 1-2 và 3 là cấp cao nhất (parent_id là 0) => 03 Category 1-2-3 không là con của Category nào hết.

Category 1.1 có parent_id là 10 => là con của Category 1 (vì id của nó là 10)

Category 1.1.1 có parent_id là 13 => là con của Category 1.1 (vì id của nó là 13)

Tương tự như vậy, ta suy ra mối quan hệ của các Category còn lại.

Ở đây chúng ta cần danh mục này hiện ra tuần tự theo cấp dạng như sau:

Category 1
-Category 1.1
--Category 1.1.1
-Category 1.2
-Category 1.3
Category 2
-Category 2.1
Category 3
-Category 3.1

Cách hiển thị này ta thường thấy trong các menu dạng listbox => liệt kê các mục cho người dùng chọn lựa.

Mình sẽ dùng php để demo giải thuật đệ quy danh mục. 

Đầu tiên ta chạy giải thuật đệ quy danh mục bằng 03 vòng lặp trước:

Chúng ta có kết quả xuất ra màn hình như sau:

Category 1
-Category 1.1
--Category 1.1.1
-Category 1.2
-Category 1.3
Category 2
-Category 2.1
Category 3
-Category 3.1

Bây giờ chúng ta sẽ viết lại nó theo kiểu đệ quy. Chúng ta tạo thêm hàm đệ quy categoryRecursive

ngay dưới hàm create()

Sau đó, xóa hết đoạn mã vòng lặp trong hàm create() và gọi hàm đệ quy vừa tạo (với id chạy đầu tiên là 0).

return $this->categoryRecursive(0);

Kết quả sẽ cho ra danh mục như cũ.

 

Giải thích chạy từng bước:

Các bạn chỉ chú ý đến 02 cột id parent_id.

Khi ta gọi hàm đệ quy $this->categoryRecursive(0)

nó sẽ đi tìm các Category có parent_id 0.

+Category 1, lấy được id = 10

Nó tìm con id = 10 category 1.1

13, 14, 15 là con Category 1.2 category 1.3

Id = 13 , tìm cháu là ra 16 category 1.1.1


+ Category 2

Category 3


Sưu tầm bởi #drM

Không có nhận xét nào:

Đăng nhận xét

Facebook Youtube RSS