給定任意深度的多維陣列,將所有標量數值乘以 2,保持結構不變。
<?php
function doubleValuesRecursive(array $arr): array
{
foreach ($arr as $key => $value) {
if (is_array($value)) {
$arr[$key] = doubleValuesRecursive($value);
} elseif (is_numeric($value)) {
$arr[$key] = $value * 2;
}
// 非數值標量(字串、布林、null)保持不變
}
return $arr;
}
$data = [1, 3, 'a' => 20, 'b' => [2, 4, 6, 'c' => 7]];
$result = doubleValuesRecursive($data);
print_r($result);
/*
Array
(
[0] => 2
[1] => 6
[a] => 40
[b] => Array
(
[0] => 4
[1] => 8
[2] => 12
[c] => 14
)
)
*/
<?php
$data = [1, 3, 'a' => 20, 'b' => [2, 4, 6, 'c' => 7]];
array_walk_recursive($data, function(&$value, $key) {
if (is_numeric($value)) {
$value *= 2;
}
});
print_r($data); // 直接修改原陣列,無需回傳
| 特性 | 遞迴函式 | array_walk_recursive |
|---|---|---|
| 程式碼量 | 較多 | 極少 |
| 效能 | 函式呼叫開銷 | C 內建迭代,較快 |
| 修改方式 | 回傳新陣列(不可變風格) | 傳址修改原陣列 |
| 鍵名保留 | 完整保留 | 完整保留 |
| 可控制深度 | 容易加入深度參數 | 需自行實作包裝 |
$targetKeys = ['price', 'amount', 'total'];
array_walk_recursive($data, function(&$value, $key) use ($targetKeys) {
if (is_numeric($value) && in_array($key, $targetKeys, true)) {
$value *= 2;
}
});