Verschachteltes Array aus Nested Sets

tequito

Mitglied
Hallo,

ich komme einfachnicht weiter. Ziel ist ein verschachteltes Array, das aus einer Nested Sets Anordnung gebildet wird.

So sähe der Baum optisch aus:
PHP:
Lebewesen
|
`-- Säugetiere
|   |
|   `-- Primaten
|   |   |
|   |   `-- Halbaffen
|   |   |
|   |   `-- Affen
|   |
|   `-- Nagetiere
|
`-- Menschen
    |
    `-- Asiaten
    |
    `-- Afrikaner

Die Abfrage liefert, wie nachfolgend sortiert, diese Werte:
PHP:
id  name        level  kinder  davor  danach
============================================
 7  Lebewesen    0     8       0      0
10  Säugetiere   1     4       1      0
 2  Primaten     2     2       1      0
 8  Halbaffen    3     0       1      0
 4  Affen        3     0       0      1
33  Nagetiere    2     0       0      1
52  Menschen     1     2       0      1
22  Asiaten      2     0       1      0
26  Afrikaner    2     0       0      1
"davor sagt, ob der Eintrag ein Elternelement hat, "danach" sagt ob der Eintrag Kinder hat.

Wie kann man nun anhand dieser Werte ein verschachteltes Array bauen mit der ID als Key?
PHP:
Array
(
  [7] => Array
    (
      [id] => 7
      [name] => Lebewesen
      [child] => Array
        (
          [10] => Array
            (
              [id] => 10
              [name] => Säugetiere
              [child] => Array
                (
                  ...
                )
            )
          [52] => Array
            (
              [id] => 52
              [name] => Menschen
              [child] => Array
                (
                  [22] => Array
                    (
                      [id] => 22
                      [name] => Asiaten
                    )
                  [26] => Array
                    (
                      [id] => 26
                      [name] => Afrikaner
                    )
                )
            )
        )
    )
)
 
von Anfang, sollst du SQL-Abfrage bilden mit
ORDER BY level ASC, davon ASC, danach DESC
wenn ich deine Frage richtig versteht habe...
 
Und wie mache ich das? Habe gar keinen Code-Ansatz. :(

Im Internet habe ich jetzt 4 Stunden gesucht und alles was ich gefunden habe waren die selbe Frage, aber nie Antworten.

Nirgends konnte ich finden wie ich mit Nested Sets eine <UL>-<LI>-HTML-Ausgabe hinbekomme.
 
Hast du dir schonmal nested sets genauer angeschaut...wie die aufgebaut sind?

Um deine Struktur als nested set abzuspeichern, müsstest du folgende Daten hinterlegen:
Code:
          |lft|rgt
----------+---+---
Lebewesen | 1 | 18
Säugetiere| 2 | 11
Primaten  | 3 |  8
Halbaffen | 4 |  5
Affen     | 6 |  7
Nagetiere | 9 | 10
Menschen  |12 | 17
Asiaten   |13 | 14
Afrikaner |15 | 16


Sowas wie Eltern, Kinder etc. benötigst du da nicht :)

http://de.wikipedia.org/wiki/Nested_Sets
 
PHP:
$struct = array();
$level = 0;
$helper =& $struct;
foreach($data as $item) {
	if($level < $item['level']) {
		$keys = array_keys($helper);
		$helper =& $helper[$keys[count($keys)-1]]['children'];
	} else if($level > $item['level']) {
		$helper =& $struct;
		for($i=0; $i<$level-1; $i++) {
			$keys = array_keys($helper);
			$helper =& $helper[$keys[count($keys)-1]]['children'];
		}
	}
	$helper[$item['id']] = array(
		'id'       => $item['id'],
		'name'     => $item['name'],
		'children' => array(),
	);
	$level = $item['level'];
}
 
Hast du dir schonmal nested sets genauer angeschaut...wie die aufgebaut sind?

Sowas wie Eltern, Kinder etc. benötigst du da nicht :)
Ich möchte mir die Ausgabe als <ul><li> im HTML generieren und weiß leider überhaupt nicht wie ich die Verschachtelung hinbekomme.

@Gumbo:
Was genau soll der Code machen? Bei mir gibt das nur die einzelnen Datensätze als Array untereinander aus.
 
Hallo,

Gumbo erstellt dort aus deinem Set einen Mehrstufigen Array den du dann wiederum durchlaufen könntest um eine Liste wie du sie haben möchtest, anzulegen.
Mfg xErY
 
Der Algorithmus erzeugt die genannte Datenstruktur auf der Basis der Datensätze in der Form:
PHP:
$data = array(
	array(
		'id'    => 7,
		'name'  => 'Lebewesen',
		'level' => 0,
	),
	array(
		'id'    => 10,
		'name'  => 'Säugetiere',
		'level' => 1,
	),
	// […]
);
 
Zurück