Generowanie drzewa z tablicy asocjacyjnej
Mamy podaną tablicę zawierającą tablice asocjacyjne reprezentujące poszczególne elementy drzewa. Te wewnętrzne tablice zawierają id elementu, id rodzica oraz nazwę. Z tej struktury wygenerujemy drzewo. Nasza początkowa tablica:
$arr = array ( array ( 'id' => '1', 'parent_id' => '2', 'name' => 'Name 1', ), array ( 'id' => '2', 'parent_id' => '6', 'name' => 'Name 2', ), array ( 'id' => '3', 'parent_id' => '5', 'name' => 'Name 3', ), array ( 'id' => '4', 'parent_id' => '2', 'name' => 'Name 4', ), array ( 'id' => '5', 'parent_id' => '0', 'name' => 'Name 5', ), array ( 'id' => '6', 'parent_id' => '0', 'name' => 'Name 6', ), array ( 'id' => '7', 'parent_id' => '6', 'name' => 'Name 7', ), array ( 'id' => '8', 'parent_id' => '2', 'name' => 'Name 8', ), array ( 'id' => '9', 'parent_id' => '5', 'name' => 'Name 9', ) );
$indexed_arr = array(); foreach($arr as $item) { $item['children'] = array(); $indexed_arr[$item['id']] = $item; }Rozpoczynamy teraz właściwą budowę drzewa. Przechodzimy przez wcześniej zaindeksowaną tablicę. Ważną rzeczą jest przypisanie do zmiennej $item referencji do elementu aby pracować na oryginalnym elemencie. Następnie wykonujemy sprawdzenie czy element ma rodzica. Jeśli nie (parent_id = 0) to do elementu drzewa przypisujemy jego samego (referencja). W przeciwnym wypadku jeśli istnieje parent_id modyfikujemy tablicę w ten sposób, że do rodzica przypisujemy tablicę (referencja) z dziećmi (indeks children).
$tree = array(); foreach($indexed_arr as $id => $v) { $item = &$indexed_arr[$id]; if($item['parent_id'] == 0) { $tree[$id] = &$item; } elseif(isset($indexed_arr[$item['parent_id']])) { $indexed_arr[$item['parent_id']]['children'][$id] = &$item; } else { $tree['_orphans_'][$id] = &$item; } } print_r($tree);Wynik funkcji print_r jest następujący.
Array ( [5] => Array ( [id] => 5 [parent_id] => 0 [name] => Name 5 [children] => Array ( [3] => Array ( [id] => 3 [parent_id] => 5 [name] => Name 3 [children] => Array ( ) ) [9] => Array ( [id] => 9 [parent_id] => 5 [name] => Name 9 [children] => Array ( ) ) ) ) [6] => Array ( [id] => 6 [parent_id] => 0 [name] => Name 6 [children] => Array ( [2] => Array ( [id] => 2 [parent_id] => 6 [name] => Name 2 [children] => Array ( [1] => Array ( [id] => 1 [parent_id] => 2 [name] => Name 1 [children] => Array ( ) ) [4] => Array ( [id] => 4 [parent_id] => 2 [name] => Name 4 [children] => Array ( ) ) [8] => Array ( [id] => 8 [parent_id] => 2 [name] => Name 8 [children] => Array ( ) ) ) ) [7] => Array ( [id] => 7 [parent_id] => 6 [name] => Name 7 [children] => Array ( ) ) ) ) )