
本文介绍了如何使用 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 函数的行为是编写高效和可靠的代码的关键。
以上就是PHP 递归地在多维数组中特定键后插入键值对的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1323180.html
微信扫一扫
支付宝扫一扫