2016-03-02 110 views
0

我有一個遞歸的$data結構,我需要修改。考慮到$item的每個節點都應該獲得值爲$value的屬性。我試過的東西(以及它們如何失敗)是:如何使array_walk_recursive訪問每個節點?

  • array_walk_recursive:只訪問葉節點。
  • 堆棧/隊列:我無法修改原始結構,但只改變堆棧/隊列上的副本。
  • 循環:如果沒有堆棧/隊列方法,我需要知道嵌套層次並編寫大量的嵌套循環。
  • array_map:由於$value的值不是靜態的,而是前面的代碼的結果,所以我未能寫出正確的遞歸回調函數。所以它必須以某種方式進入回調。由於use僅適用於匿名函數,因此我沒有設法編寫遞歸函數。
  • 循環和遞歸函數:This answer由於與array_map方法相同的原因而失敗。

我的代碼情況看起來類似於此示例:

<?php 

$value = 'example'; 

$data = array(
    'foo' => 'bar' 
    'items' => array(
     array(
      'foo' => 'bar', 
      'items' => array(
       array('foo' => 'bar') 
      ) 
     ) 
    ) 
); 

// do this recursively to every member of an 'items' property: 
$item['baz'] = $value; 

你能想出不同的方法,或者幫我理順了這些,我失敗了,在迄今爲止的一個?

更新

一些代碼,我想,沒有工作:

// Parse error: syntax error, unexpected 'use' (T_USE), expecting '{' 

function do (&$item) use ($value) { 

    $item['baz'] = $value; 

    foreach ($item['items'] as $next) { 

     do($next); 
    } 
} 

// Undefined variable: value 

function do (&$item) { 

    $item['baz'] = $value; 

    foreach ($item['items'] as $next) { 

     do($next); 
    } 
} 

foreach ($data['items'] as $item) { 

    do($item); 
} 

作品,現在(我寧願不必經過$value參數,雖然):

function do (&$item, $value) { 

    $item['baz'] = $value; 

    foreach ($item['items'] as &$next) { 

     do($next, $value); 
    } 
} 

foreach ($data['items'] as &$item) { 

    do($item, $value); 
} 
+0

您是否嘗試過寫一個*遞歸函數* ...? – deceze

+0

'我需要知道嵌套層次並寫入了很多嵌套循環。「ough?你似乎錯過了所謂的遞歸:https://en.wikipedia.org/wiki/Recursion_(computer_science) –

+0

@MarcinOrlowski:你引用的方法是明確地避免遞歸。 – hielsnoppe

回答

0

檢查此密碼以獲取每個密鑰和值:

<?php 

error_reporting(0); 

$value = 'example'; 

$data = array(
    'foo' => 'bar', 
    'items' => array(array('foo' => 'bar','items' => array(array('foo' => 'bar')))) 
); 


$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($data)); 
    foreach ($iterator as $k => $v) { 
     echo $k.'=>'.$v; 
     echo '</br>'; 
    } 

?> 

格式化是必要的,但不足以滿足最小編輯長度。所以我添加了這個無用的文本。

+0

這一個doesn'如果他們有一個子數組,則訪問頂級密鑰。 –

0

下面的遞歸函數適用於我。請注意,它需要參照也傳遞foreach循環內部參數:

$value = 'example'; 

function do (&$item, $value) { 

    $item['baz'] = $value; 

    foreach ($item['items'] as &$next) { 

     do($next, $value); 
    } 
} 

foreach ($data['items'] as &$item) { 

    do($item, $value); 
}