 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
27.04.2008, 21:49
|
#1
|
|
TP-Senior
Registriert seit: Jan 2006
|
Verschachteltes Array aus Nested Sets
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-Code:
Lebewesen
|
`-- Säugetiere
| |
| `-- Primaten
| | |
| | `-- Halbaffen
| | |
| | `-- Affen
| |
| `-- Nagetiere
|
`-- Menschen
|
`-- Asiaten
|
`-- Afrikaner
Die Abfrage liefert, wie nachfolgend sortiert, diese Werte:
PHP-Code:
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-Code:
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
)
)
)
)
)
)
__________________
Gruß,
Peter
|
|
|
28.04.2008, 11:27
|
#2
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
Hi,
hier mal ein Ansatz. Die Abfrage nach level kann man auch noch eleganter lösen.
PHP-Code:
$rows = array( array(7,'Lebewesen',0,8,0,0), array(10,'Säugetiere',1,4,1,0), array(2,'Primaten',2,2,1,0), array(8,'Halbaffen',3,0,1,0), array(4,'Affen',3,0,0,1), array(33,'Nagetiere',2,0,0,1), array(52,'Menschen',1,2,0,1), array(22,'Asiaten',2,0,1,0), array(26,'Afrikaner',2,0,0,1) );
$temp=array(); $new = true; $level = -1; foreach($rows as $k=>$a) { if ($a[2] == 0 && $a[2]!=$level) { $levelId = array(); // reset array } $id = $a[0]; $level = $a[2]; $levelId[$level]=$a[0]; echo 'Level '.$a[2].' ID '.$id.'</br>'; $array = array( 'id' => $id, ); if ($level == 0) { $temp[$id] = $array; } elseif ($level == 1) { $temp[$levelId[0]]['child'][$id] = $array; } elseif ($level == 2) { $temp[$levelId[0]]['child'][$id][$levelId[1]]['child'] = $array; } elseif ($level == 3) { $temp[$levelId[0]]['child'][$id][$levelId[1]]['child'][$levelId[2]]['child'] = $array; } } echo '<h1>Rows</h1>'; echo '<pre>'.print_r($rows,true).'</pre>'; echo '<h1>Array</h1>'; echo '<pre>'.print_r($temp,true).'</pre>';
|
|
|
28.04.2008, 11:34
|
#3
|
|
TP-Senior
Registriert seit: Jan 2006
|
Problem dabei ist aber, dass das nur in Ebene 1 funktioniert.
__________________
Gruß,
Peter
|
|
|
28.04.2008, 11:43
|
#4
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
wieso? Hast Du Dir die Ausgabe des Scriptes angeschaut?
|
|
|
29.04.2008, 00:42
|
#5
|
|
TP-Senior
Registriert seit: Jan 2006
|
Ja, ich habe deinen Code ausgeführt und das Ergebnis ist nicht korrekt.
PHP-Code:
Array ( [7] => Array ( [id] => 7 [child] => Array ( [10] => Array ( [id] => 10 )
[2] => Array ( [10] => Array ( [child] => Array ( [id] => 2 ) ) )
[8] => Array ( [10] => Array ( [child] => Array ( [2] => Array ( [child] => Array ( [id] => 8 ) ) ) ) )
[4] => Array ( [10] => Array ( [child] => Array ( [2] => Array ( [child] => Array ( [id] => 4 ) ) ) ) )
[33] => Array ( [10] => Array ( [child] => Array ( [id] => 33 ) ) )
[52] => Array ( [id] => 52 )
[22] => Array ( [52] => Array ( [child] => Array ( [id] => 22 ) ) )
[26] => Array ( [52] => Array ( [child] => Array ( [id] => 26 ) ) ) ) ) )
Die Kinder sind öfters vorhanden als sie sein dürften und teilweise auch doppelt. Alles hängt unter der ID 7, auch die Kinder von anderen Bäumen.
__________________
Gruß,
Peter
|
|
|
29.04.2008, 00:56
|
#6
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
vergleich mal mit Deinem Array
ja gut, war ein kleiner Fehler drin, aber war ja nur ein Ansatz
PHP-Code:
$rows = array( array(7,'Lebewesen',0,8,0,0), array(10,'Säugetiere',1,4,1,0), array(2,'Primaten',2,2,1,0), array(8,'Halbaffen',3,0,1,0), array(4,'Affen',3,0,0,1), array(33,'Nagetiere',2,0,0,1), array(52,'Menschen',1,2,0,1), array(22,'Asiaten',2,0,1,0), array(26,'Afrikaner',2,0,0,1) );
$temp=array(); $new = true; $level = -1; foreach($rows as $k=>$a) { if ($a[2] == 0 && $a[2]!=$level) { $levelId = array(); // reset array } $id = $a[0]; $level = $a[2]; $levelId[$level]=$a[0]; echo 'Level '.$a[2].' ID '.$id.'</br>'; $array = array( 'id' => $id, 'name' => $a[1] ); if ($level == 0) { $temp[$id] = $array; } elseif ($level == 1) { $temp[$levelId[0]]['child'][$id] = $array; } elseif ($level == 2) { $temp[$levelId[0]]['child'][$levelId[1]]['child'][$id] = $array; } elseif ($level == 3) { $temp[$levelId[0]]['child'][$levelId[1]]['child'][$levelId[2]]['child'][$id] = $array; } } echo '<h1>Rows</h1>'; echo '<pre>'.print_r($rows,true).'</pre>'; echo '<h1>Array</h1>'; echo '<pre>'.print_r($temp,true).'</pre>';
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 16:04 Uhr.
|
 |