2009-07-02 20 views
2

配列の要素を再帰的に検索して置換したい。PHPの再帰的な検索と配列要素の置換

配列は、ツリーベースにはそう見えるよう

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

など

私は例えば、私は内のすべてのエントリを交換したいので、他の項目で特定のアイテムを交換できるようにしたい

タイプAの配列をタイプBの配列で配列します。ただし、ここにキャッチがあります。新しく置き換えられたオブジェクトには、タイプAの子を置き換える必要があります。

は、これまでのところ私はRefObjectsの最初のレベルに置き換えられますが、その後追加の子どもを検索しません

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; 

を持っています。

私は何時間も壁に頭を打ちました。助けてください!

乾杯、 Gaz。

答えて

8

機能にコードを入れて、再びそれを呼び出します。擬似コード:

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

再帰の基本は再び同じコードを呼び出すために...

2

このコードを関数に追加し、子ノードで関数を呼び出す必要があります。このような

何か(parseNodes関数が関数内で再び呼び出されます)。

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; 
} 

ジョシュ

+0

子ノードから何も返されない場合は、関数に何らかのチェックを追加する必要があります。それ以外の場合は、ループでスタックされます – Josh

0

ここで再帰的解決策は、そこに私を取得するための

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

感謝です!

関連する問題