RecursiveIteratorIterator 與 RecursiveArrayIterator 結合的一個非常有用的案例,是在任何深度的多維陣列上替換陣列值。
通常,`array_walk_recursive` 會被用來取代陣列深處的值,但不幸的是,這只在有標準鍵值對時才有效 - 換句話說,`array_walk_recursive` 只會訪問葉節點,而不是陣列本身。
所以要解決這個問題,迭代器可以這樣使用
<?php
$array = [
'test' => 'value',
'level_one' => [
'level_two' => [
'level_three' => [
'replace_this_array' => [
'special_key' => 'replacement_value',
'key_one' => 'testing',
'key_two' => 'value',
'four' => 'another value'
]
],
'ordinary_key' => 'value'
]
]
];
$arrayIterator = new \RecursiveArrayIterator($array);
$recursiveIterator = new \RecursiveIteratorIterator($arrayIterator, \RecursiveIteratorIterator::SELF_FIRST);
foreach ($recursiveIterator as $key => $value) {
if (is_array($value) && array_key_exists('special_key', $value)) {
$replaced = array_fill(0, count($value), $value['special_key']);
$value = array_combine(array_keys($value), $replaced);
$value['new_key'] = 'new value';
$currentDepth = $recursiveIterator->getDepth();
for ($subDepth = $currentDepth; $subDepth >= 0; $subDepth--) {
$subIterator = $recursiveIterator->getSubIterator($subDepth);
$subIterator->offsetSet($subIterator->key(), ($subDepth === $currentDepth ? $value : $recursiveIterator->getSubIterator(($subDepth+1))->getArrayCopy()));
}
}
}
return $recursiveIterator->getArrayCopy();
$array = [
'test' => 'value',
'level_one' => [
'level_two' => [
'level_three' => [
'replace_this_array' => [
'special_key' => 'replacement_value',
'key_one' => 'replacement_value',
'key_two' => 'replacement_value',
'four' => 'replacement_value',
'new_key' => 'new value'
]
],
'ordinary_key' => 'value'
]
]
];
?>
關鍵在於向上遍歷樹以儲存該層級的更改 - 僅呼叫 `$recursiveIterator->offsetSet();` 只會在根陣列上設定一個鍵。