
本文将介绍如何在 PHP 中递归地遍历多维数组,并在每个包含特定键(例如 'banana')的子数组中插入新的键值对(例如 'apple' => 'red')。我们将提供一个可复用的函数,该函数能够处理任意深度的嵌套数组,并在目标键存在时,将新的键值对添加到同一级别的数组中。
递归插入键值对
在处理嵌套的多维数组时,我们需要一种能够深入到每个层级并执行操作的方法。递归函数是解决这类问题的理想选择。以下是一个 PHP 函数,它接受一个数组、要插入的键值对以及作为插入触发器的目标键作为参数:
function insertValueToArr(&$arr, $insVal = [], $sibling = null) {
static $ins;
static $sib;
if ($insVal) {
$ins = $insVal;
$sib = $sibling;
}
$merge = false;
foreach ($arr as $k => &$val) {
if (is_array($val)) {
insertValueToArr($val);
}
if ($k == $sib) {
$merge = true;
}
}
if ($merge) {
$arr = array_merge($arr, $ins);
}
return $arr;
}代码解释:
-
函数定义: insertValueToArr(&$arr, $insVal = [], $sibling = null) 定义了函数,它接受三个参数:
立即学习“PHP免费学习笔记(深入)”;
- &$arr: 要操作的数组的引用。使用引用允许函数直接修改原始数组。
- $insVal: 要插入的键值对,默认为空数组。
- $sibling: 触发插入的目标键,默认为 null。
静态变量: 使用 static $ins; 和 static $sib; 来存储 $insVal 和 $sibling 的值,以便在递归调用中保持这些值。
初始化: if ($insVal) 块用于初始化静态变量 $ins 和 $sib。这确保了在第一次调用函数时,这些变量会被正确设置。
-
递归遍历: foreach ($arr as $k => &$val) 循环遍历数组的每个元素。
- if (is_array($val)):如果当前元素是一个数组,则递归调用 insertValueToArr() 函数,以处理嵌套的数组。
目标键检查: if ($k == $sib):检查当前键是否与目标键 $sibling 匹配。如果匹配,则将 $merge 标志设置为 true。
插入键值对: if ($merge):如果在循环中找到了目标键,则使用 array_merge() 函数将新的键值对 $insVal 合并到当前数组中。array_merge会将后面的数组合并到前面的数组中。
返回数组: 函数返回修改后的数组。
使用示例
假设我们有以下数组:
$original = [
0 => [
'something1' => 'something',
'banana' => 'yellow',
'something2' => [
'something3' => 'something',
'something4' => [
'something5' => 'something',
'banana' => 'yellow',
'something6' => [
'banana' => 'yellow',
]
],
'banana' => 'yellow',
],
'something7' => [
0 => [
'something8' => 'something',
'banana' => 'yellow',
],
],
],
1 => [
'something9' => 'something',
'banana' => 'yellow',
],
2 => [
'something10' => 'something',
],
];要将键值对 'apple' => 'red' 插入到每个包含键 'banana' 的子数组中,我们可以这样调用该函数:
insertValueToArr($original, ['apple' => 'red'], 'banana'); print_r($original);
输出结果将是:
Array
(
[0] => Array
(
[something1] => something
[banana] => yellow
[apple] => red
[something2] => Array
(
[something3] => something
[something4] => Array
(
[something5] => something
[banana] => yellow
[apple] => red
[something6] => Array
(
[banana] => yellow
[apple] => red
)
)
[banana] => yellow
[apple] => red
)
[something7] => Array
(
[0] => Array
(
[something8] => something
[banana] => yellow
[apple] => red
)
)
)
[1] => Array
(
[something9] => something
[banana] => yellow
[apple] => red
)
[2] => Array
(
[something10] => something
)
)注意事项
- 引用传递: 函数使用引用传递 (&$arr),这意味着它会直接修改原始数组。如果不想修改原始数组,请先复制一份。
- 目标键不存在: 如果数组中没有找到目标键,则不会插入新的键值对。
- 键的顺序: array_merge 函数会将 $insVal 中的键值对添加到数组的末尾。如果需要特定的键顺序,可能需要使用其他方法。
- 性能: 对于非常大的数组,递归可能会影响性能。在性能敏感的应用中,可以考虑使用迭代方法。
总结
通过使用递归函数,我们可以轻松地在 PHP 中处理嵌套的多维数组,并在满足特定条件时插入新的键值对。本文提供的函数是一个通用的解决方案,可以根据需要进行修改和扩展,以满足不同的需求。 记住,理解递归的原理和注意事项是编写高效且可靠的代码的关键。










