Sto cercando di scrivere una funzione che accetta una matrice di pagine/categorie (da un risultato di database flat) e genera una serie di elementi di pagina/categoria nidificati basati sugli ID padre . Mi piacerebbe farlo in modo ricorsivo, in modo da poter eseguire qualsiasi livello di nidificazione.Funzione ricorsiva per generare array multidimensionale dal risultato del database
Per esempio: sto recupero tutte le pagine in una query, e questa è la cosa la tabella del database si presenta come
+-------+---------------+---------------------------+
| id | parent_id | title |
+-------+---------------+---------------------------+
| 1 | 0 | Parent Page |
| 2 | 1 | Sub Page |
| 3 | 2 | Sub Sub Page |
| 4 | 0 | Another Parent Page |
+-------+---------------+---------------------------+
E questa è la matrice Vorrei finire con per elaborare in i miei file di visualizzazione:
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
)
)
ho guardato e ha cercato quasi ogni soluzione che ho incontrato (ci sono un sacco di loro qui su Stack Overflow, ma non hanno avuto fortuna ottenere qualcosa di abbastanza generico che funziona per entrambi pagine e categorie
Ecco il più vicino che ho ottenuto, ma non funziona perché sto assegnando i figli al genitore di primo livello.
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);
}
Non puoi semplicemente lavorare con una serie di tutte le parent_ids e un altro array per le tue pagine? – djot