Tôi đang tìm cách viết một hàm lấy một mảng trang / danh mục (từ kết quả cơ sở dữ liệu phẳng) và tạo một mảng các mục trang / danh mục lồng nhau dựa trên id mẹ. Tôi muốn thực hiện điều này một cách đệ quy, để có thể thực hiện bất kỳ mức độ lồng nào.
Ví dụ: Tôi đang tìm nạp tất cả các trang trong một truy vấn và đây là bảng cơ sở dữ liệu trông như thế nào
+-------+---------------+---------------------------+
| id | parent_id | title |
+-------+---------------+---------------------------+
| 1 | 0 | Parent Page |
| 2 | 1 | Sub Page |
| 3 | 2 | Sub Sub Page |
| 4 | 0 | Another Parent Page |
+-------+---------------+---------------------------+
Và đây là mảng tôi muốn kết thúc để xử lý trong tệp chế độ xem của mình:
Array
(
[0] => Array
(
[id] => 1
[parent_id] => 0
[title] => Parent Page
[children] => Array
(
[0] => Array
(
[id] => 2
[parent_id] => 1
[title] => Sub Page
[children] => Array
(
[0] => Array
(
[id] => 3
[parent_id] => 1
[title] => Sub Sub Page
)
)
)
)
)
[1] => Array
(
[id] => 4
[parent_id] => 0
[title] => Another Parent Page
)
)
Tôi đã xem xét và thử gần như mọi giải pháp mà tôi đã gặp (có rất nhiều giải pháp ở đây trên Stack Overflow, nhưng không may mắn có được thứ gì đó đủ chung chung sẽ hoạt động cho cả trang và danh mục.
Đây là kết quả gần nhất mà tôi nhận được, nhưng nó không hoạt động vì tôi đang giao con cái cho phụ huynh cấp một.
function page_walk($array, $parent_id = FALSE)
{
$organized_pages = array();
$children = array();
foreach($array as $index => $page)
{
if ( $page['parent_id'] == 0) // No, just spit it out and you're done
{
$organized_pages[$index] = $page;
}
else // If it does,
{
$organized_pages[$parent_id]['children'][$page['id']] = $this->page_walk($page, $parent_id);
}
}
return $organized_pages;
}
function page_list($array)
{
$fakepages = array();
$fakepages[0] = array('id' => 1, 'parent_id' => 0, 'title' => 'Parent Page');
$fakepages[1] = array('id' => 2, 'parent_id' => 1, 'title' => 'Sub Page');
$fakepages[2] = array('id' => 3, 'parent_id' => 2, 'title' => 'Sub Sub Page');
$fakepages[3] = array('id' => 4, 'parent_id' => 3, 'title' => 'Another Parent Page');
$pages = $this->page_walk($fakepages, 0);
print_r($pages);
}