2016-05-12 8 views
1
$menus = [ 
     0 => [ 
      'id' => 'home', 
      'title' => 'Home', 
      'url' => '/display/home', 
      'children' => [], 
      'parent' => null 
     ], 
     1 => [ 
      'id' => 'nodes', 
      'title' => 'Nodes', 
      'url' => 'nodes/index', 
      'children' => [ 
       0 => [ 
        'id' => 'addNode', 
        'title' => 'Add Node', 
        'url' => '/nodes/add', 
        'children' => [], 
        'parent' => "nodes" 
       ], 
       1 => [ 
        'id' => 'editNode', 
        'title' => 'Edit Node', 
        'url' => '/nodes/edit', 
        'children' => [], 
        'parent' => 'nodes' 
       ], 
       2 => [ 
        'id' => 'deleteNode', 
        'title' => 'Delete Node', 
        'url' => '/nodes/delete', 
        'children' => [ 
         0 => [ 
          'id' => 'deleteMultipleNodes', 
          'title' => 'Delete Multiple Nodes', 
          'url' => '/nodes/deleteall', 
          'children' => [ 
           0 => [ 
            'id' => 'deleteMultipleSelectedNodes', 
            'title' => 'Delete Multiple Selected Nodes', 
            'url' => '/nodes/deleteallselected', 
            'children' => [], 
            'parent' => 'deleteMultipleNodes' 
           ] 
          ], 
          'parent' => 'deleteNode' 
         ] 
        ], 
        'parent' => 'nodes' 
       ] 

      ], 
      'parent' => null 
     ] 
    ]; 

この配列があるとします。私が欲しいのは、"id"の配列を再帰的に検索し、見つかった場合は新しい子をその要素の子配列にプッシュすることです。PHPは再帰的検索中に配列に値をプッシュします

私はさまざまな方法で試してみましたが、RecursiveArrayIteratorを使用して配列をトラバースしようとしましたが、トラバース中に配列のインデックスに値をプッシュする方法が問題です。ここでの例の場合

は私の試みの一つからのコードです:

private function traverseArray($array) 
{ 

    $child = [ 
     'id' => 'deleteMultipleNotSelectedNodes', 
     'title' => 'Delete Multiple Not Selected Nodes', 
     'url' => '/nodes/deletenotselected', 
     'children' => [], 
     'parent' => 'deleteMultipleNodes' 
    ]; 
    foreach($array as $key=>$value) 
    { 
     if(is_array($value)) 
     { 
      $this->traverseArray($value); 
     } 
     if($key == "id" && $value == "deleteMultipleNodes") 
     { 
      array_push($array["children"], $child); // This part is confusing me, How to add the child on this index where the id is found. 
     } 
    } 
} 

私の日を救う効率的な方法でそのようなことを行う方法上の任意の助け。

+0

あなたの検索で 'deleteMultipleNodes'を修正した場合は、インデックスを知る必要がありますので、何が混乱しますか? –

+0

この子をどのインデックスにプッシュしますか? –

+0

それは再帰的に掘り下げられ、IDが見つかった場合、そのIDの要素に子をプッシュしたいと考えています。しかし、私はインデックスを持っていません –

答えて

3

ここでは、それは$これを使用して、代わりに値に何を割り当てる$値を比較する際にバグを修正せずにうまくいく方法です。

& $ arrayと& $ valueの違いは参考になりますので、元のデータを新しい変数にコピーする代わりに変更してください。

<?php 
$menus = [ 
     0 => [ 
      'id' => 'home', 
      'title' => 'Home', 
      'url' => '/display/home', 
      'children' => [], 
      'parent' => null 
     ], 
     1 => [ 
      'id' => 'nodes', 
      'title' => 'Nodes', 
      'url' => 'nodes/index', 
      'children' => [ 
       0 => [ 
        'id' => 'addNode', 
        'title' => 'Add Node', 
        'url' => '/nodes/add', 
        'children' => [], 
        'parent' => "nodes" 
       ], 
       1 => [ 
        'id' => 'editNode', 
        'title' => 'Edit Node', 
        'url' => '/nodes/edit', 
        'children' => [], 
        'parent' => 'nodes' 
       ], 
       2 => [ 
        'id' => 'deleteNode', 
        'title' => 'Delete Node', 
        'url' => '/nodes/delete', 
        'children' => [ 
         0 => [ 
          'id' => 'deleteMultipleNodes', 
          'title' => 'Delete Multiple Nodes', 
          'url' => '/nodes/deleteall', 
          'children' => [ 
           0 => [ 
            'id' => 'deleteMultipleSelectedNodes', 
            'title' => 'Delete Multiple Selected Nodes', 
            'url' => '/nodes/deleteallselected', 
            'children' => [], 
            'parent' => 'deleteMultipleNodes' 
           ] 
          ], 
          'parent' => 'deleteNode' 
         ] 
        ], 
        'parent' => 'nodes' 
       ] 

      ], 
      'parent' => null 
     ] 
    ]; 

function traverseArray(&$array) 
{ 
    $child = [ 
     'id' => 'deleteMultipleNotSelectedNodes', 
     'title' => 'Delete Multiple Not Selected Nodes', 
     'url' => '/nodes/deletenotselected', 
     'children' => [], 
     'parent' => 'deleteMultipleNodes' 
    ]; 
    foreach($array as $key=>&$value) 
    { 
     if(is_array($value)) 
     { 
      traverseArray($value); 
     } 
     if($key == "id" && $value == "deleteMultipleNodes") 
     { 
      array_push($array["children"], $child); 
     } 
    } 
} 

echo "=== before \n"; 
var_export($menus); 
echo "\n\n"; 
traverseArray($menus); 
echo "=== after \n"; 
var_export($menus); 
+0

うわーそれは働いた。 &$ arrayが実際に何をするか説明してください。 –

+0

参照渡しhttp://php.net/manual/en/language.references.pass.php foreachサイクル中の配列の変更 http://codereview.stackexchange.com/questions/12652/modifying-an-array -during-a-foreach-loop – Richard

+0

array_walk_recursiveを使用する方が効率的ですか? –

0

多分、これはあなたを助けるでしょう。 array_walk_recursiveはすべての要素を処理します。また、コールバック関数は$valueを参照して受け取ることができます。したがって、$valueを変更すると、ソース配列内の項目が変更されます。

array_walk_recursive($array, function (&$value, $key) { 
    if(is_array($value) && $value['id'] === "deleteMultipleNodes") { 
     $child = [ 
      'id' => 'deleteMultipleNotSelectedNodes', 
      'title' => 'Delete Multiple Not Selected Nodes', 
      'url' => '/nodes/deletenotselected', 
      'children' => [], 
      'parent' => 'deleteMultipleNodes' 
     ]; 
     array_push($value['children'], $child); 
    } 
}); 
+0

'$ value ===" deleteMultipleNodes "'(string)は 'array_push'の最初の引数としてどのように使われますか? –

+0

Thanks @ php-dev、これは私の間違いでした。私はコードを更新しました。今はOKです。 – Andrew

関連する問題