Mehrdimensionale Arrays - Hinzufügen von Elementen an bestimmer Stelle

djnelly

Erfahrenes Mitglied
Hallo an alle,

ich stehe hier vor einem Problem und hoffe auf Unterstützung.
Ich versuche das mal mit Beispieldaten zu beschreiben und die Klasse darzustellen.

PHP:
$ChronikDaten = new Chronik();
$ChronikDaten->setName('Berta Schmidt');
$ChronikDaten->getStammbaum();

class Chronik {
    public function setName($Name) {
        $this->NameOrg = $Name;
        $this->Name = $Name;
    }

    private function getSQLDaten() {
        $SQLK = "
        select
        KindID,
        KindName
        from Familie
        where Name = '$this->Name'
        ";
        $SQLA = mysqli_query($Datenbank->getVerbindung(), $SQLK) or die ("SQL-Error: " .mysqli_error( $Datenbank->getVerbindung() ));

        $SQLDaten = $SQLA;
       
        return($SQLDaten);
    } // getSQLDaten()
   
    public function getStammbaum($ErsterAufruf = "Y") {
   
        //SQL-Abfrage ausführen
        $SQLDaten = $this->getSQLDaten();
       
        while($DtPerson = mysqli_fetch_object($SQLDaten)) {
            if($ErsterAufruf == "Y") {
                $this->Chronik['Name'] = $this->NameOrg // z.B. Berta Schmidt
            }
            //Kind
            $this->Chronik['Name'][$DtPerson->KindID]['Name'] = $DtPerson->KindName;
           
            //Prüfen ob das Kind wiederrum ein Kind hat
            $this->Name = $this->Chronik['KindName'];
            getPersonendaten('N');                   

        } // while    

    } // getPersonendaten
}


Die Ausgabe des Array sollte in etwas so aussehen:
Code:
$Chronik (
    [Berta Schmit] => Array
        (
            [Kind Holger] => Array
                (
                [Kind Carsten] //hat keine Kinder
                [Kind Michael] => Array
                    (
                    [Kind Jens] // hat keine Kunder
                    )
                )
            [Kind Matthias] //keine Kinder
        )  

)



Mein Problem besteht darin, dass ich einen Endlos-Aufruf der Funktion habe. Da jedes Kind wiederum eines oder mehrere eigene Kinder haben könnte.
Der Selbstaufruf und das Ermitteln der Daten ist für mich keine Problem. Ich habe Probleme, das neue Array (Kind) unter seiner Mutter einzuhängen.

Mit array_push wird es am Ende eingefügt. Ich muss aber einen endlosen Baum zusammenbauen. Ich suche nach einer Möglichkeit, die letzte Position des Zeiger oder des Elements mit in dem erneuten Aufruf nehmen zu können und das neue Kind an der richtigen Stelle einbinden zu können.

Vielen Dank für eure Hilfe! Ich hoffe, ich konnte es einigermaßen erklären.
 
Zuletzt bearbeitet:
Hallo, wie ist deine Datenbank-Tabelle aufgebaut? Wie referenzierst, du, die zugehörigkeit der Personen untereinander?

letztendlich musst du eine Funktion recursive ausführen

Code:
function buildTree(array &$elements, $parentId = 0) {
       $branch = array();

       foreach ($elements as $element) {
           if ($element['parent_id'] == $parentId) {
               $children = $this->buildTree($elements, $element['id']);
               if ($children) {
                   $element['children'] = $children;
               }
               $branch[] = $element;
           }
       }

       return $branch;
   }
 
Deine Methode geht immer von Anfang an durch. Das ist nicht gut.
Starte mit dem Ersten Namen. Dann erstellst du ein Array mit seinen Kindern wobei du für jedes Kind die Prozedur ebenfalls durchläufst. Diesen Array gibt su dann zurück

ungetestet
PHP:
class Chronik{
	public getTree(){
		return getTree('StartName');
	}
	protected function getChilds($iName){
		$childs = array();
		$sql = "select kindName from familie where name = {$iName}";
		if ($result = mysqli_query($Datenbank->getVerbindung(), $sql)) {
			while($dtPerson = mysqli_fetch_object($result)){
				$childs[$dtPerson->kindName] = getChilds($dtPerson->kindName);
			}
		}
		mysqli_free_result($result);
		return $childs;
	}
}
 
Hallo Kalito,

mein Beispiel hier ist wirklich sehr vereinfacht. Die DB würde wie folgt aussehen:

Code:
Name                KindID        KindName
Berta Schmidt        1            Holger
Berta Schmidt        2            Matthias
Holger                1            Carsten
Holger                2            Michael
Matthias            1            keine Kinder
Michael                1            Jens

So richtig verstehe ich deine Funktion noch nicht. Wenn ich das richtig verstehe, schaust du recursive und sucht nach der $parentID. Danach schaust du erneut nach Kindern.
Das macht doch aber mein Beispiel auch schon. Nur wie kann ich das Kind-Array unterhalb des Parent-Array einhängen.
 
Deine Methode geht immer von Anfang an durch. Das ist nicht gut.
Starte mit dem Ersten Namen. Dann erstellst du ein Array mit seinen Kindern wobei du für jedes Kind die Prozedur ebenfalls durchläufst. Diesen Array gibt su dann zurück

ungetestet
PHP:
class Chronik{
    public getTree(){
        return getTree('StartName');
    }
    protected function getChilds($iName){
        $childs = array();
        $sql = "select kindName from familie where name = {$iName}";
        if ($result = mysqli_query($Datenbank->getVerbindung(), $sql)) {
            while($dtPerson = mysqli_fetch_object($result)){
                $childs[$dtPerson->kindName] = getChilds($dtPerson->kindName);
            }
        }
        mysqli_free_result($result);
        return $childs;
    }
}

Hallo Yaslaw,

mein Problem ist, ich brauche den "Baum" als komplette Array-Struktur, da dieses Array nochmal an anderer Stelle verarbeitet werden muss. Mit dem jetzigen Code bekomme ich ein Array in einer Ebene?!?! oder?
 
Nein. Du bekommst eine Beumstruktur. Mit der folgenden Zeil wird für jedes Kind die Struktur erweitert
PHP:
$childs[$dtPerson->kindName] = getChilds($dtPerson->kindName);
 
Ich habe das Mal auf meine Struktur übertragen und probiert. Funktioniert! Vielen Dank Yaslaw.

Noch eine Frage bitte. Ich muss an dieser Stelle:

PHP:
$childs[$dtPerson->kindName] = getChilds($dtPerson->kindName);

noch mehr Infos außer dem Namen speichern. z. B. Straße, PLZ, Ort
Wie kann ich das erweitern, damit der rekursive Aufruf dann noch geht?
 
Meine Durchlauf sieht mit deiner Funktion nun so aus:

PHP:
(
    [10520] => Array
        (
        )

    [11316] => Array
        (
        )

    [12135] => Array
        (
            [11316] => Array
                (
                )

            [10520] => Array
                (
                )

            [13342] => Array
                (
                    [10520] => Array
                        (
                        )

                )

            [14395] => Array
                (
                    [10520] => Array
                        (
                        )

                )

            [16582] => Array
                (
                )

        )

)

Alles gut soweit. Ich benötige pro Array-Key aber noch weitere Values. Im Moment ist nur ein Key vorhanden.

PHP:
   [10520] => Array
        (
            [Name] = Martin
            [Alter] = 18
        )

Diese Infos kommen aus dem SQL-Befehl mit.
 
Ich denke, ich habe es hinbekommen:

PHP:
$childs[$dtPerson->kindName] = $this->getChilds($dtPerson->kindName);
$childs[$dtPerson->kindName]['Name'] = $dtPerson->Name;
$childs[$dtPerson->kindName]['Alter'] = $dtPerson->Alter;

Danke dir vielmals!!!
 

Neue Beiträge

Zurück