Willkommen im #Neuland
Login wie bei quake.ingame.de zuvor, die Passwörter aus der alten Datenbank wurden aber gelöscht - einmal hier neu anfordern.
Wer seine E-Mail-Adresse nicht mehr hat oder kennt, bitte eine Nachricht mit Infos schicken o. im Discord melden.

PQ Discord Server: #planetquake                                                                                                                                         Spenden? Hier entlang!

PHP: Children rekursiv herausfinden -> Array Problem

Forum für alles rund ums Coden und web.design - HTML, XHTML, XML, CSS, PHP, ASP, Zugriffsrechten, Mods uvm.
Antworten
Mein Name sei Wapaz
Humilation
Humilation
Beiträge: 10589
Registriert: Dez 2006
Kontaktdaten:

PHP: Children rekursiv herausfinden -> Array Problem

Beitrag von Mein Name sei Wapaz »

So, ich habe folgenden Codeblock (da werden einige Funktionen von CodeIgniter benutzt, wo man sonst mysql abfragen hätte, aber das tut denke ich nichts zu Sache):

Code: Alles auswählen

function getAssetChildrenIDRecursive($id) {
    
    $children = array();
    $children = $this->asset_model->getDBChildAssetIDs($id);
    //$allChildren = array();
    //$str = '';
    
        foreach ($children as $child_id){
            if ($this->asset_model->hasDBChildAssets($child_id) == TRUE){
                  $this->getAssetChildrenIDRecursive($child_id);
                 //$str = 'Asset '.$child_id.' has subchildren
';
                
            //} else {
            //    $str .= 'Asset '.$child_id.' has NO subchildren
';    
            //    $allChildren[] = $child_id;
            }
            $allChildren[] = $child_id;
            
            
        }
        //echo $str;
        return $allChildren;
    }
Wie man am auskommentierten sehen kann, funktioniert der Code eigentlich, d.h. es werden die Child IDs gefunden, und ich kann sie mit echo ausgeben. Aber ich will sie alle in einem flachen Array haben, nur werden immer nur die letzten Children (also die am weitesten oben) geschrieben, und die anderen sind nicht da. Irgendwie glaube ich, dass der Fehler ziemlich einfach zu beheben ist, aber ich komme ums verrecken nicht darauf, was es ist. Irgendwie wird das Array überschrieben, aber ich weiß nicht wann, und wie ich es verhindern kann.

Edit: eine Lösung: global $allChildren in der Funktion, sonst wird das Array immer wieder erstellt
zeeno
Uriel
Uriel
Beiträge: 2793
Registriert: Nov 2002
Kontaktdaten:

Beitrag von zeeno »

Global brauchst du in dem Fall nicht, wenn du das Array $allChildren einfach vor der For-Schleife initialisierst. So wie du es schon auskommentiert hast :ugly:

Und übrigens: Bitte ändert doch ma die Farben des Syntax-Highlightings für PHP. Es ist einfach nur Augenkrebs hoch 10! :ugly:
Bild

Drum & Bass: Hartes oder Weiches

"Demokratie ist, wenn man sich aussuchen kann wer verarscht." - Hagen Rether
[/CENTER]
zzz
Anarki
Anarki
Beiträge: 1549
Registriert: Apr 2000

Beitrag von zzz »

Code: Alles auswählen

function getAssetChildrenIDRecursive($id) {
	$allChildren = array();
	$children = $this->asset_model->getDBChildAssetIDs($id);
	foreach ($children as $child_id){
		$allChildren += $this->getAssetChildrenIDRecursive($child_id);
		$allChildren[] = $child_id;
	}
	return $allChildren;
}

$foo = $bar->getAssetChildrenIDRecursive(42);
Siehe: Array-Operatoren


oder

Code: Alles auswählen

function getAssetChildrenIDRecursive($id, &$allChildren) {
	$children = $this->asset_model->getDBChildAssetIDs($id);
	foreach ($children as $child_id){
		$this->getAssetChildrenIDRecursive($child_id, $allChildren);
		$allChildren[] = $child_id;
	}
}

$foo = array();
$bar->getAssetChildrenIDRecursive(42, $foo);
Siehe: Parameterübergabe per Referenz


Beides ungetestet. Die zweite Variante ist potentiell schneller (macht sich wahrscheinlich erst ab ~10.000 Einträgen überhaupt bemerkbar), die erste "hübscher".
Mein Name sei Wapaz
Humilation
Humilation
Beiträge: 10589
Registriert: Dez 2006
Kontaktdaten:

Beitrag von Mein Name sei Wapaz »

Vielen Dank cha0s, beides funktioniert, und ich verstehe sogar warum. :ugly: Leider ist die php.net Doku für mich wie so oft nicht wirklich hilfreich.

@zeeno: genau das funktioniert nicht, weil dann bei jedem Aufrufen der Funktion das array wieder neu erstellt wird, und die vorherigen Inhalte verloren gehen, und man nur die letzten bzw. ersten IDs bekommt.
zeeno
Uriel
Uriel
Beiträge: 2793
Registriert: Nov 2002
Kontaktdaten:

Beitrag von zeeno »

Darko Deluxe hat geschrieben:Vielen Dank cha0s, beides funktioniert, und ich verstehe sogar warum. :ugly: Leider ist die php.net Doku für mich wie so oft nicht wirklich hilfreich.

@zeeno: genau das funktioniert nicht, weil dann bei jedem Aufrufen der Funktion das array wieder neu erstellt wird, und die vorherigen Inhalte verloren gehen, und man nur die letzten bzw. ersten IDs bekommt.
Das ginge ja schon, wenn du auch den Rückgabewert von der Rekursion weiterverwendet hättest. So wie chaos es gemacht hat. :)

Hab nur nicht genau hingeschaut.
Bild

Drum & Bass: Hartes oder Weiches

"Demokratie ist, wenn man sich aussuchen kann wer verarscht." - Hagen Rether
[/CENTER]
Antworten