======[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