PHP-рекурсивный массив из списка

Я возвращаю список страниц и их родительские страницы из базы данных MySQL и помещаю все результаты в массив следующим образом, где каждый результат представляет собой массив, который включает в себя родительский элемент, имя и идентификатор форума (ключ страницы массива также то же, что и идентификатор страницы).

Для модели и приложения есть некоторые другие параметры.

  • «корневые страницы» имеют родительский элемент 0
  • нет сиротских страниц

поэтому запрос MySQL вернет этот набор данных.

pages=> [1] => array(id=>1, parent=>0, name=>Hello World) [2] => array(id=>1, parent=>1, name=>Child of Hello World) [3] => array(id=>1, parent=>0, name=>Brother of Hello World) [4] => array(id=>4, parent=>2, name=Grand-child of Hello World) [6] => array(id=>6, parent=>4, name=Great-grand-child of Hello World) 

я бы хотел преобразовать массив во что-то похожее на это

 pages=> [1] => id=>1, name=>Hello World children=> [2] => id=>1 name=>Child of Hello World children=> [4] => id=>4 name=> Grand-child of Hello World) children=> [6] => id=>6 name=> Great-grand-child of Hello World children= null [3] => array(id=>1, name=>Brother of Hello World children=>null 

Поэтому в принципе, я хочу превратить линейный массив во вложенный многомерный массив, чтобы я мог распечатать свой файл Sitemap.

это должно быть рекурсивным решением. существует более 700 страниц и до 5 или 6 уровней.

Я только хочу сделать 1 запрос mysql. не 700, поэтому, пожалуйста, не давайте мне решение на основе mysql.

 <?php $pages = array(); $pages[1] = array('id' => 1, 'parent' => 0, 'name' => 'Hello World'); $pages[2] = array('id' => 1, 'parent' => 1, 'name' => 'Child of Hello World'); $pages[3] = array('id' => 1, 'parent' => 0, 'name' => 'Brother of Hello World'); $pages[4] = array('id' => 4, 'parent' => 2, 'name' => 'Grand-child of Hello World'); $pages[6] = array('id' => 6, 'parent' => 4, 'name' => 'Great-grand-child of Hello World'); $children = array(); foreach($pages as $key => $page){ $parent = (int)$page['parent']; if(!isset($children[$parent])) $children[$parent] = array(); $children[$parent][$key] = array('id' => $page['id'], 'name' => $page['name']); } $new_pages = recursive_append_children($children[0], $children); function recursive_append_children($arr, $children){ foreach($arr as $key => $page) if(isset($children[$key])) $arr[$key]['children'] = recursive_append_children($children[$key], $children); return $arr; } print_r($new_pages); ?> 

Выходы:

 Array ( [1] => Array ( [id] => 1 [name] => Hello World [children] => Array ( [2] => Array ( [id] => 1 [name] => Child of Hello World [children] => Array ( [4] => Array ( [id] => 4 [name] => Grand-child of Hello World [children] => Array ( [6] => Array ( [id] => 6 [name] => Great-grand-child of Hello World ) ) ) ) ) ) ) [3] => Array ( [id] => 1 [name] => Brother of Hello World ) ) 

Вот быстрая рекурсивная функция, которая строит дерево. Обратите внимание, что это не очень удобно (одна причина состоит в том, что он не избавляется от элементов, которые уже добавлены в дерево, поэтому каждый раз, когда вы рекурсируете, он проходит через весь список), но он должен работать достаточно, чтобы вы начали.

 function buildTree($itemList, $parentId) { // return an array of items with parent = $parentId $result = array(); foreach ($itemList as $item) { if ($item['parent'] == $parentId) { $newItem = $item; $newItem['children'] = buildTree($itemList, $newItem['id']); $result[] = $newItem; } } if (count($result) > 0) return $result; return null; } $myTree = buildTree($myArray, 0);