2009-07-02 22 views
2

Ich möchte Elemente in einem Array rekursiv suchen und ersetzen.PHP rekursive suchen und ersetzen Array-Elemente

Das Array Baum basiert sieht so wie

Object 
    Children 
     Object type A 
     Object type B 
Object 
    Children 
     Object type A 
Object 

usw.

Ich möchte bestimmte Gegenstände mit anderen Gegenständen ersetzen zu können, so zum Beispiel, ich in der alle Einträge ersetzen wollen Array (auf welcher Tiefenebene) von Typ A mit einem Array vom Typ B. Aber hier ist der Haken: Die neu ersetzten Objekte können auch Children vom Typ A haben, die ersetzt werden müssen.

Bisher habe ich

bekam
foreach($nodes as &$node) { 
     // Replace node? 
     if($node['type'] == 'RefObject') { 
      $n = $this->site->get_node_where('id', $node['node_ref']); 
      // Replace node 
      $node = $this->site->get_node_where('object_id', $n['object_id']); 
      // Get children 
      $node['children'] = $this->site->get_descendants($node['lft'], $node['rgt']); 
     } 
    } 
    return $nodes; 

, die die erste Stufe der RefObjects ersetzen wird, sondern die später hinzugefügt Kinder nicht suchen.

Ich habe stundenlang mit diesem Kopf meinen Kopf gegen eine Wand geschlagen. Bitte helfen Sie!

Prost, Gaz.

Antwort

8

Setzen Sie den Code in eine Funktion und es wieder aufrufen. Pseudo-Code:

function checkArray($array) { 
    ... 
    if (is_array($node)) { // or whatever other criterium 
     checkArray($node); // same function 
    } 
} 

Die Grundlagen der Rekursion sind wieder den gleichen Code zu nennen ...

2

Sie müssen diesen Code in eine Funktion hinzufügen und die Funktion auf den Kindknoten aufrufen.

so etwas wie dieses (man beachte die parseNodes Funktion wieder in der Funktion aufgerufen wird):

function parseNodes($node) { 

    foreach($nodes as &$node) { 
    // Replace node? 
    if($node['type'] == 'RefObject') { 
     $n = $this->site->get_node_where('id', $node['node_ref']); 
     // Replace node 
     $node = $this->site->get_node_where('object_id', $n['object_id']); 
     // Get children 
     $node['children'] = parseNodes($this->site->get_descendants($node['lft'], $node['rgt'])); 
    } 
    } 
    return $nodes; 
} 

Josh

+0

Sie müssen eine Art der Überprüfung der Funktion hinzufügen, wenn nichts von den Kindknoten zurückgegeben wird, sonst wird es in einer Schleife stecken bleiben – Josh

0

Hier ist eine rekursive Lösung

function makeObject($array){ 
    $data = false; 
    foreach($array as $key=>$value){ 
     if(is_array($value)){ 
     $value = makeObject($value); 
     } 
     $data -> {$key} = $value; 
    } 
    return $data; 
} 

Dank für mich da immer!