Tôi đang tìm cách viết một hàm 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 làm điều này một cách đệ quy, để bất kỳ mức độ làm tổ nào cũng có thể được thực hiện.Chức năng đệ quy để tạo mảng đa chiều từ kết quả cơ sở dữ liệu
Ví dụ: Tôi lấy tất cả các trang trong một truy vấn, và đây là những gì các bảng cơ sở dữ liệu trông giống như
+-------+---------------+---------------------------+
| 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 với xử lý trong xem tác phẩm của tôi:
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 đã nhìn và cố gắng gần như mọi giải pháp tôi đã đi qua (có rất nhiều trong số họ ở đây trên stack Overflow, nhưng đã không có may mắn nhận được một cái gì đó đủ chung chung mà sẽ làm việc cho cả hai các trang và loại.
Đây là gần nhất tôi đã nhận được, nhưng nó không hoạt động vì tôi chỉ định trẻ em cho cấp độ cha mẹ đầu tiên.
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);
}
Có thể bạn không chỉ làm việc với một mảng của tất cả parent_ids và một mảng cho các trang của bạn? – djot