Parent/Child-Struktur in Array abbilden
am 07.09.2006 10:18:28 von Jens Bottenschein
Hallo
habe folgendes Problem:
ich möchte aus einer Datenbank eine Baumstruktur nach Parent/Child-Art in
ein Array einlesen. Die Datenbank ist ungefähr so aufgebaut:
ID parent
1 0
2 0
3 1
4 1
5 3
6 5
7 3
usw.
also eine Baumstruktur mit beliebig vielen Verzweigungen. Die ID ist in der
Datenbank nicht (mehr) fortlaufend (einige Datensätze wurden und werden
gelöscht)
Wie kann ich das am besten lösen?
Grüße
Jens
Re: Parent/Child-Struktur in Array abbilden
am 07.09.2006 10:27:05 von Michael Jostmeyer
Jens Bottenschein schrieb:
> Hallo
>
> habe folgendes Problem:
> ich möchte aus einer Datenbank eine Baumstruktur nach Parent/Child-Art in
> ein Array einlesen. Die Datenbank ist ungefähr so aufgebaut:
>
> ID parent
> 1 0
> 2 0
> 3 1
> 4 1
> 5 3
> 6 5
> 7 3
> usw.
>
> also eine Baumstruktur mit beliebig vielen Verzweigungen. Die ID ist in der
> Datenbank nicht (mehr) fortlaufend (einige Datensätze wurden und werden
> gelöscht)
>
> Wie kann ich das am besten lösen?
>
> Grüße
> Jens
>
>
Vielleicht so:
array('1'=>'0','2'=>'0',...)
Oder Du baust Dir eine Klasse mit den Properties ID und ParentId und
machst dann ein Array aus Instanzen dieser Klasse.
Gruss Josi
Re: Parent/Child-Struktur in Array abbilden
am 07.09.2006 10:35:21 von Thomas Grabietz
Jens Bottenschein wrote:
> Hallo
>
> habe folgendes Problem:
> ich möchte aus einer Datenbank eine Baumstruktur nach Parent/Child-Art in
> ein Array einlesen. Die Datenbank ist ungefähr so aufgebaut:
>
>
> also eine Baumstruktur mit beliebig vielen Verzweigungen. Die ID ist in
> der Datenbank nicht (mehr) fortlaufend (einige Datensätze wurden und
> werden gelöscht)
>
> Wie kann ich das am besten lösen?
>
Ich würde die Datensätze erst einmal mit einer Rekursion Auslesen.
Also eine Funktion die sich immer selber dann wieder aufruft wenn es Kinder
gibt, die die gleiche ParentId haben wie die ID des gerade ausgelesenen
Datensatzes.
Ferner kannst Du Arrays aufeinander legen, so dass sich auch in den Array
dann die Baumstrucktur ergibt. Am Ende eines Zweiges wird ein Array
zurückgegeben, was auf den aufrufenden Array-Zweig gelegt wird und
soweiter...
Tom
Re: Parent/Child-Struktur in Array abbilden
am 07.09.2006 10:56:32 von Jens Bottenschein
"Thomas Grabietz" schrieb:
> Ich w rde die Datens??tze erst einmal mit einer Rekursion Auslesen.
> Also eine Funktion die sich immer selber dann wieder aufruft wenn es
Kinder
> gibt, die die gleiche ParentId haben wie die ID des gerade ausgelesenen
> Datensatzes.
> Ferner kannst Du Arrays aufeinander legen, so dass sich auch in den Array
> dann die Baumstrucktur ergibt. Am Ende eines Zweiges wird ein Array
> zurückgegeben, was auf den aufrufenden Array-Zweig gelegt wird und
> soweiter...
>
> Tom
>
Erstmal danke für eure Antworten. Ich hatte diesbezüglich ein Alorithmus im
Netz gefunden, den ich auch schon ausprobiert hatte:
$sql = "SELECT id, parent FROM projekte order by parent";
$result = mssql_query($sql, $mssql_id);
$data_projekte = array();
while ($content = mssql_fetch_assoc($result)) {
$data_projekte[] = array('id' => $content[id], 'parent' =>
$content[parent]);
}
$stack = array();
$items = array();
while ($row = array_shift($data_projekte)){
$row['id'] = (int) $row['id'];
$row['parent'] = (int) $row['parent'];
// child schon da, aber parent noch nicht!
if (isset($items[$row['id']])){
$tmp = $items[$row['id']]['children'];
$items[$row['id']] = $row;
$items[$row['id']]['children'] = $tmp;
}else{
$items[$row['id']] = $row;
}
$items[$row['parent']]['children'][$row['id']] =& $items[$row['id']];
}
Hab jetzt mal angefangen mit dem Array $items, das hier erzeugt wird,
weiterzuarbeiten. Scheint auch soweit zu funktionieren. Was mich aber sehr
verwirrt hat, war, dass
print_r($items)
mehrmals die gleiche ID ausgegeben hat und in der Weiterverarbeitung ein Bug
war, was zu einer falschen Ausgabe führte. Aber jetzt läuft's
Grüße
Jens