User Tools

Site Tools


php:kompost:adjacencytree

[PHP] AdjacencyTree auslesen

Ich habe bereits im MySQL gezeigt, wie man einen solchen Tree auslesen kann: adjacencytree. Hier nun ein Beispiel für PHP. Hintergrund ist eine Anfrage von suntrop im Tutorial-Froum: Formular-Select mit Hierarchie aufbauen (aus PHP-Array) Aus dieser Lösung habe ich noch eine OOP-Variante gebaut die einfacher wiederverwendbar ist: [PHP] AdjacencyTree Class

Meine Lösung

Code

<?php
//mein Testarray
$tree[] = array('id'=>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 '<select>';
foreach($tree as $node){
	echo sprintf('<option vlaue="%d">%s</option>', $node['id'], $node['text']);
}
echo '</select>';
 
 
/**
 * Egänzt den Tree-Arry um die Felder 'sort', 'lvl', 'text'
 * @param Array<Node>    &$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

<select>
	<option vlaue="1">Eins</option>
	<option vlaue="2">Zwei</option>
	<option vlaue="3">-- Zwei-Eins</option>
	<option vlaue="4">-- -- Zwei-Eins-Eins</option>
	<option vlaue="5">-- -- Zwei-Eins-Zwei</option>
	<option vlaue="6">Drei</option>
	<option vlaue="7">-- Drei-Eins</option>
	<option vlaue="8">-- -- Drei-Zwei</option>
	<option vlaue="9">-- -- -- Drei-Zwei-Eins</option>
</select>
php/kompost/adjacencytree.txt · Last modified: 11.12.2013 10:34:20 (external edit)