
本文介绍了如何使用 PHP 递归地在多维数组中,如果存在特定键(例如 'banana'),则插入新的键值对(例如 'apple' => 'red')。通过自定义函数 `ins_value_to_arr`,可以遍历数组的每个元素,并在包含目标键的同级数组中插入新的键值对。
在处理复杂的数据结构时,经常需要在多维数组的特定位置插入新的键值对。如果数组的结构是固定的,这很容易实现。但是,如果数组是多维的,并且嵌套的深度不确定,那么就需要使用递归的方法来解决这个问题。
以下是一个示例函数,它可以在多维数组中递归地查找特定的键,并在找到该键的同级数组中插入新的键值对:
function ins_value_to_arr(&$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)){
ins_value_to_arr($val);
}
if($k == $sib){
$merge = true;
}
}
if($merge){
$arr = array_merge($arr,$ins);
}
return $arr;
}代码解释:
立即学习“PHP免费学习笔记(深入)”;
-
函数签名: ins_value_to_arr(&$arr, $insVal = [] , $sibling = NULL)
- &$arr: 这是一个引用传递的数组。这意味着函数可以直接修改原始数组,而不需要返回一个新的数组。
- $insVal = []: 这是一个可选参数,表示要插入的键值对数组。 默认值是空数组。
- $sibling = NULL: 这是一个可选参数,表示要查找的兄弟键(即目标键)。默认值为 NULL。
-
静态变量: static $ins; static $sib;
- 使用静态变量是为了在递归调用中保持 $insVal 和 $sibling 的值。 这样,每次递归调用时,不需要重复传递这些参数。
-
初始化静态变量:
if($insVal){ $ins = $insVal; $sib = $sibling; }- 这段代码检查 $insVal 是否为空。如果不为空,则将 $insVal 和 $sibling 的值分别赋给静态变量 $ins 和 $sib。 这确保了在第一次调用该函数时,静态变量被正确初始化。
-
遍历数组: foreach($arr as $k => &$val)
- 使用 foreach 循环遍历数组的每个元素。 $k 是键名,&$val 是键值的引用。 使用引用允许函数修改数组的值。
-
递归调用: if(is_array($val)){ ins_value_to_arr($val); }
- 如果当前元素的值是一个数组,则递归调用 ins_value_to_arr 函数,继续遍历子数组。
-
检查兄弟键: if($k == $sib){ $merge = true; }
- 如果当前键名 $k 等于要查找的兄弟键 $sib,则将 $merge 变量设置为 true。 这表示找到了目标键。
-
合并数组: if($merge){ $arr = array_merge($arr,$ins); }
- 如果在遍历过程中 $merge 变量被设置为 true,则使用 array_merge 函数将 $ins 数组合并到当前数组 $arr 中。 这将在找到的目标键的同级数组中插入新的键值对。
-
返回数组: return $arr;
- 返回修改后的数组。虽然使用了引用传递,但显式返回数组可以提高代码的可读性。
使用示例:
$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',
],
];
ins_value_to_arr($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
)
)注意事项:
- 该函数使用引用传递修改原始数组,因此不需要显式地将返回值赋给变量。
- array_merge 的行为取决于数组的键类型。 如果键是字符串,则后面的值将覆盖前面的值。 如果键是数字,则 array_merge 会重新索引数组。
- 如果目标键在数组中多次出现,新的键值对将被插入多次。
- 该函数假设要插入的键值对的键名在数组中不存在。如果键名已经存在,array_merge 会覆盖现有的值。
总结:
通过使用递归函数,可以方便地在多维数组中查找特定的键,并在找到该键的同级数组中插入新的键值对。 这在处理复杂的数据结构时非常有用。 理解递归的原理和 array_merge 函数的行为是编写高效和可靠的代码的关键。











