======[PHP] AdjacencyTree auslesen====== Ich habe bereits im MySQL gezeigt, wie man einen solchen Tree auslesen kann: [[:mysql:adjacencytree]]. Hier nun ein Beispiel für PHP. Hintergrund ist eine Anfrage von suntrop im Tutorial-Froum: [[http://www.tutorials.de/php/392167-formular-select-mit-hierarchie-aufbauen-aus-php-array.html|Formular-Select mit Hierarchie aufbauen (aus PHP-Array)]] Aus dieser Lösung habe ich noch eine OOP-Variante gebaut die einfacher wiederverwendbar ist: [[:php:libraries:adjacencytreeclass]] ===== Meine Lösung ===== ==== Code ==== 1, 'parent'=>0, 'name'=>'Eins'); $tree[] = array('id'=>2, 'parent'=>0, 'name'=>'Zwei'); $tree[] = array('id'=>3, 'parent'=>2, 'name'=>'Zwei-Eins'); $tree[] = array('id'=>4, 'parent'=>3, 'name'=>'Zwei-Eins-Eins'); $tree[] = array('id'=>5, 'parent'=>3, 'name'=>'Zwei-Eins-Zwei'); $tree[] = array('id'=>6, 'parent'=>0, 'name'=>'Drei'); $tree[] = array('id'=>7, 'parent'=>6, 'name'=>'Drei-Eins'); $tree[] = array('id'=>8, 'parent'=>7, 'name'=>'Drei-Zwei'); $tree[] = array('id'=>9, 'parent'=>8, 'name'=>'Drei-Zwei-Eins'); //den TreeArray um die Tree-Informationen ergänzen addTreeInfos($tree); //und richtig sortieren array_sort_by_subarray_item($tree, 'sort'); //Und ausgeben echo ''; /** * Egänzt den Tree-Arry um die Felder 'sort', 'lvl', 'text' * @param Array &$array Array mit den Treenodes * @param Integer $parent Parent-ID * @param String $sort aktueller Sortierungs-String * @param Integer $lvl Level */ function addTreeInfos(&$array, $parent = 0, $sort = '', $lvl = 0){ //Ich iteriere extra über die ID. Mit foreach auf einen Referenzierten Array der in //der rekursiven Funktion verändert wird ist nicht gut, da aisch dann innerhalb der //Schleife der interne Zeiger weiter bewegen würde. for($i = 0; $i < count($array); $i++){ $node = &$array[$i]; if($node['parent'] == $parent){ //Das Sortfeld definieren: zB: 0001.0003.0005 $node['sort'] = trim(sprintf('%s.%04d', $sort, $node['id']), '.'); //Den aktuellen Level speichern $node['lvl'] = $lvl; //Den Tree-Anzeigetext: zB: -- -- Zwei-Eins-Zwei $node['text'] = str_repeat('-- ', $lvl) . $node['name']; //Und dasselbe für alle Kinder des aktellen Nodes addTreeInfos($array, $node['id'], $node['sort'], $lvl+1); } } } /** * mpl by ERB software * @author stefan.erb(at)erb-software.com * @link http://wiki.yaslaw.info/wikka/PhpArraySortBySubarrayItem * @since PHP 5.2 * Sortiert einen 2-Dimensionalen Array nach einem Key in der 2ten Dimension * @param $array Array der sortiert wird * @param $key Key im Array der sortiert werden soll (key oder index) * @param $direction Sortierrichtung. SORT_ASC oder SORT_DESC * @param $sort_flags SORT_REGULAR, SORT_STRING, SORT_NUMERIC. Siehe sort_flags-Parameter von sort() */ function array_sort_by_subarray_item(&$array, $key, $direction = SORT_ASC, $sort_flags = SORT_REGULAR){ $sort = array(); foreach($array as $index => $item){ $sort[$index] = strtoupper($item[$key]); } return array_multisort($sort, $direction, $sort_flags, $array); } ?> ==== Ausgabe ==== Das ergibt den folgenen HTML-Code