(플랫 데이터베이스 결과에서) 페이지 / 카테고리의 배열을 취하고 상위 ID를 기반으로 중첩 된 페이지 / 카테고리 항목의 배열을 생성하는 함수를 작성하려고합니다. 모든 수준의 중첩을 수행 할 수 있도록이 작업을 재귀 적으로 수행하고 싶습니다.
예 : 하나의 쿼리로 모든 페이지를 가져오고 있는데 이것이 데이터베이스 테이블의 모습입니다.
+-------+---------------+---------------------------+
| id | parent_id | title |
+-------+---------------+---------------------------+
| 1 | 0 | Parent Page |
| 2 | 1 | Sub Page |
| 3 | 2 | Sub Sub Page |
| 4 | 0 | Another Parent Page |
+-------+---------------+---------------------------+
그리고 이것은 내 뷰 파일에서 처리하기 위해 끝내고 싶은 배열입니다.
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
)
)
나는 내가 만난 거의 모든 솔루션을 살펴보고 시도했습니다 (여기 Stack Overflow에 많은 솔루션이 있지만 페이지와 범주 모두에서 작동하는 일반적인 것을 얻지 못했습니다.
여기에 가장 가까운 것이 있지만 첫 번째 수준의 부모에게 자식을 할당하기 때문에 작동하지 않습니다.
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);
}