Deus Figendi: Array rekursiv nach oben ändern

Beitrag lesen

Zwar gibt das Script korrekt aus, dass Amerika, Nordamerika, Europa und Nicht-EU active=1 werden soll, aber das Array selbst ändert sich nicht.

Hier mal mein kompletter Code nochmal zum Testen.
Kannst Du mir sagen, was daran noch falsch ist?

Ich vermute, dass entweder function oder foreach oder beide nicht direkt auf dem Array arbeiten, welches sie erhalten sondern auf einer Kopie. Ich kenne mich aber nicht ausreichend mit PHP-interna aus um das mit Bestimmtheit zu sagen.
Aus dem Bauch heraus würde ich sagen es ist die Funktion.

function make_active_return_active (&$input) {
    if(is_array($input['children'])){
        foreach($input['children'] as $child){
            $test=make_active_return_active($child);
            if($test==1){
                echo $input['name']." ".$test."\n";
                $input['active'] = 1;
            }
        }
        return $input['active'];
    }
    elseif($input['active']){
        return $input['active'];
    }
    elseif($input[0]['name']){
        foreach($input as $child){
            make_active_return_active($child);
        }
    }
}

Du hast vergessen vor dem foreach das active auf 0 zu stellen. Das stand da eigentlich, damit vorhandene aktive Werte ggf. zurück gesetzt werden, wenn alle nachfolgenden auch 0 wären. Mag natürlich sein dass du das nicht willst oder nicht brauchst (weil das array ohnehin immer neu mit 0en initiiert wird).  
Ich fürchte du wirst daher den ganzen Array zurück geben müssen...  
~~~php
  
 function make_active_return_active (&$input) {  
     if(is_array($input['children'])){  
         foreach($input['children'] as $child){  
             $test=make_active_return_active($child);  
             if($test['active']==1){ //Zeile veraendert  
                 echo $input['name']." ".$test['active']."\n";  
                 $input['active'] = 1;  
                 $child = $test; //Zeile hinzugefuegt  
             }  
         }  
         return $input; //Zeile geaendert  
     }  
     elseif($input['active']){  
         return $input; //Zeile geandert  
     }  
//Wozu ist dieser Teil:  
     elseif($input[0]['name']){  
         foreach($input as $child){  
             make_active_return_active($child);  
         }  
     }  
//Wozu war dieser Teil oben?  
 }  

Vorausgesetzt php übernimmt die Information, die man in $child schreibt ins array. Dann sollte das so oder so ähnlich gehen.
Den letzten elseif-Block verstehe ich nicht, zumal du die Rückgabe nicht weiter verarbeitest.
Darüber hinaus gibt es keinen Rückgabewert der Funktion, wenn das übergebene Array keine Kinder hat und inaktiv ist. Daher war mein Pseudocode oben auch so aufgebaut, dass erstmal geändert wird und dann in jedem Fall am Ende returnt.

--
sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(