我有一個遞歸的$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);
}
您是否嘗試過寫一個*遞歸函數* ...? – deceze
'我需要知道嵌套層次並寫入了很多嵌套循環。「ough?你似乎錯過了所謂的遞歸:https://en.wikipedia.org/wiki/Recursion_(computer_science) –
@MarcinOrlowski:你引用的方法是明確地避免遞歸。 – hielsnoppe