PHP JSON - Speichern eines dynamischen Kategoriebaums

xamunrax

Erfahrenes Mitglied
Hallo zusammen,

ich versuche seit Stunden meinen dynamisch erstellen Kategoriebaum in meine mySQL-DB zu speichern, jedoch habe ich irgendwo einen logischen denkfehler.

jSON:
PHP:
["1", "2", "3", "4", ["5", [["6", ["7"]]]], "8", "9", "10"]

diese jSON-Daten bekomme ich von meinem JavaScript per Ajax geschickt. Soweit so gut, nun sollen die Beziehungen der einzelnen Kategorien anhand dieser jSON-Daten gespeichert werden.

Zum Verständnis:
Kategorie(ID) "1" hat die ParentID: 0
Kategorie(ID) "2" hat die ParentID: 0
Kategorie(ID) "3" hat die ParentID: 0
Kategorie(ID) "4" hat die ParentID: 0
Kategorie(ID) "5" hat die ParentID: 0
Kategorie(ID) "6" hat die ParentID: 5
Kategorie(ID) "7" hat die ParentID: 6
Kategorie(ID) "8" hat die ParentID: 0
Kategorie(ID) "9" hat die ParentID: 0
Kategorie(ID) "10" hat die ParentID: 0

Die "Verschachtelung" der Beziehung (KategorieTiefe) soll bis in unendliche erweiterbar sein.

Eigentlich sollte das kein Problem sein, jedoch hält mich dieses Problem seit Stunden auf und ich finde keine passable Lösung. Leider kann ich nicht mal einen Code-Ansatz liefern, da er nur verwirren würde (denke ich), da meine Ansätze immer nur in einer Ebene (Kategorietiefe) funktionieren.

Vielen Dank schon mal im voraus!
 
Hallo,

was du suchst, ist eine rekursive Funktion, die ungefähr so aussieht:

PHP:
<?php
$json = '["1", "2", "3", "4", ["5", [["6", ["7"]]]], "8", "9", "10"]';


$o = json_decode($json);

function rec_insert($array, $parent = 0)
{
	$result = '';
	foreach($array as $key => $element)
	{
		if(is_array($element))
			$result .= rec_insert($element, $key);
		else
			$result .= sprintf("INSERT INTO tabelle (element,parent) VALUES (%d, %d);\n", $element, $parent);
	}
	return $result;
}

var_dump(rec_insert($o));

Die Funktion liefert nicht genau das, was du brauchst, aber vielleicht ist es ein guter Anfang, an dem du rum experimentieren kannst.
 
Vielen Dank schonmal für die schnelle Antwort, saftmeister. Habe es bereits mit rekursiven Funktionen versucht, das Problem ist das ab Ebene 2 jedes Element ein Array ist. also auch wenn nur eine Zahl drin steht, welche im nachfolgenden Element(Array) ja dann als ParentID verwendet werden soll. Ich zweifel inzwischen ob dies überhaupt möglich ist. Ich versuche die Problematik mal etwas detalierter darzustellen.

Die Problemematik stellt sich wie folgt da:

PHP:
$json = '["1", "2", "3", "4", ["5", [["6", ["7"]]]], "8", "9", "10"]';

[0]-[3] (values: 1,2,3,4) Stellen kein Problem da (ParentID:0);
[4] Ist ein Array;
[4][0] hat den Wert 5 und bekommt die ParentID: 0;
[4][1] ist ein wieder ein array;
[4][1][0] Array;
[4][1][0][0] hat den Wert 6 und bekommt die ParentID: 5;
[4][1][0][1] Array;
[4][1][0][1][0] Wert 7 ParentID: 6;
[5]-[7] (values: 8,9,10) bekommen ParentID: 0;

Alles hin und hergegrübel bringt nichts ich habe schon fast 30 test_x.php´s wenn ich bei der einen schaffe funktioniert eine andere Variante nicht mehr.
Ich hänge mal noch drei Beispiele an, vielleicht bekommt das ja jemand von euch hin.
["1", "9", "8", "7", "6", ["10", ["2"]], "5", "4", "3"]
["1", "9", "8", "7", ["6", [["10", ["2"]]]], "5", "4", "3"]
[["9", ["1"]], ["8", ["3", "2", ["4", [["6", ["7"]]]]]], ["5", ["10"]]]


hier mal die Ausgabe des Array´s (von der Erleuterung oben)
Code:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => Array
        (
            [0] => 5
            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => 6
                            [1] => Array
                                (
                                    [0] => 7
                                )

                        )

                )

        )

    [5] => 8
    [6] => 9
    [7] => 10
)
 
Zurück