Estoy buscando escribir una función que tome una matriz de páginas/categorías (de un resultado de base de datos plana) y genere una matriz de elementos de página/categoría anidados basados en los identificadores principales . Me gustaría hacer esto recursivamente, para que se pueda hacer cualquier nivel de anidación.Función recursiva para generar matriz multidimensional a partir del resultado de la base de datos
Por ejemplo: Me retracto todas las páginas en una sola consulta, y esto es lo que la base de datos de la tabla parece
+-------+---------------+---------------------------+
| id | parent_id | title |
+-------+---------------+---------------------------+
| 1 | 0 | Parent Page |
| 2 | 1 | Sub Page |
| 3 | 2 | Sub Sub Page |
| 4 | 0 | Another Parent Page |
+-------+---------------+---------------------------+
Y esta es la matriz me gustaría terminar con procesar en mis archivos de vista:
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
)
)
he buscado y probado casi todas las soluciones que he encontrado (hay un montón de ellos aquí en desbordamiento de pila, pero no han tenido suerte conseguir algo lo suficientemente genérico que funcione para ambos páginas y categorías.
Esto es lo más cerca que he estado, pero no funciona porque estoy asignando los hijos al primer nivel primario.
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);
}
no puedes trabajar con una matriz de todas parent_ids y otra matriz de tus páginas? – djot