Arreglo Recursivo de PHP de la Lista

Estoy devolviendo una lista de páginas y sus páginas principales desde una base de datos MySQL y poniendo todos los resultados en una matriz de la siguiente manera, donde cada resultado es una matriz que incluye el padre, nombre e identificación del foro (la clave de las páginas de matriz también es lo mismo que la identificación de la página).

Por el modelo y la aplicación, existen otros parámetros.

  • “páginas raíz” tienen un padre de 0
  • no hay páginas huérfanas

entonces, la consulta de MySQL devolverá este conjunto de datos.

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) 

entonces me gustaría transformar la matriz en algo que se parece a esto

 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 

Entonces, básicamente, quiero convertir una matriz lineal en una matriz multidimensional anidada para que pueda imprimir mi mapa del sitio.

necesita ser una solución recursiva. hay más de 700 páginas y hasta 5 o 6 niveles.

solo quiero hacer 1 consulta mysql no 700 así que por favor no me proporciones una solución basada en 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); ?> 

Productos:

 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 ) ) 

Aquí hay una función recursiva rápida que construye un árbol. Tenga en cuenta que no es genial (una de las razones es que no elimina los elementos que ya se han agregado al árbol, por lo que cada vez que recurse va a toda la lista), pero debería funcionar lo suficiente como para comenzar.

 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);