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 và 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 id và parent_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 và parent_id.
Khi ta gọi hàm đệ quy $this->categoryRecursive(0)
nó sẽ đi tìm các Category có parent_id là 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