PHP 递归地在多维数组中特定键后插入键/值对

霞舞
发布: 2025-10-11 10:31:30
原创
751人浏览过

php 递归地在多维数组中特定键后插入键/值对

本文旨在提供一个 PHP 函数,用于递归地遍历多维数组,并在每个包含特定键(例如 'banana')的子数组中插入新的键/值对(例如 'apple' => 'red')。该函数能够处理任意深度的嵌套数组,并在找到目标键后,将新的键/值对添加到同一层级的数组中。

在处理复杂的数据结构时,我们经常需要在多维数组中动态地添加或修改数据。当需要递归地在特定键的同级位置插入新的键/值对时,就需要一个能够处理任意深度嵌套数组的解决方案。下面的教程将提供一个 PHP 函数,实现这一功能。

函数实现

以下是一个 PHP 函数 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免费学习笔记(深入)”;

一键抠图
一键抠图

在线一键抠图换背景

一键抠图 30
查看详情 一键抠图
  1. function ins_value_to_arr(&$arr, $insVal = [] , $sibling = NULL): 定义函数 ins_value_to_arr,接受三个参数:
    • &$arr: 数组的引用,允许函数修改原始数组。
    • $insVal: 要插入的键/值对,默认为空数组。
    • $sibling: 作为参照的兄弟键名,默认为 NULL。
  2. static $ins; static $sib;: 使用静态变量来保存 $insVal 和 $sibling 的值,这样在递归调用时,这些值不会丢失。
  3. if($insVal){ ... }: 检查 $insVal 是否为空。如果不为空,则将 $insVal 赋值给静态变量 $ins,将 $sibling 赋值给静态变量 $sib。
  4. $merge = false;: 初始化一个布尔变量 $merge,用于标记是否需要合并数组。
  5. foreach($arr as $k =youjiankuohaophpcn &$val){ ... }: 遍历数组 $arr。
    • if(is_array($val)){ ins_value_to_arr($val); }: 如果当前元素 $val 是一个数组,则递归调用 ins_value_to_arr 函数,处理嵌套数组。
    • if($k == $sib){ $merge = true; }: 如果当前键 $k 等于兄弟键名 $sib,则将 $merge 设置为 true。
  6. if($merge){ $arr = array_merge($arr,$ins); }: 如果 $merge 为 true,则使用 array_merge 函数将 $ins 合并到 $arr 中。
  7. 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',
    ],
];
登录后复制

现在,我们想在每个包含键 'banana' 的子数组中插入键/值对 'apple' => 'red'。我们可以这样调用函数:

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
        )

)
登录后复制

注意事项

  • 该函数会修改原始数组,因为它接受的是数组的引用 (&$arr)。
  • 静态变量的使用使得在递归调用中可以保持要插入的键/值对和兄弟键名的值。
  • array_merge 函数会将新的键/值对添加到数组的末尾,而不是紧跟在兄弟键名之后。 如果需要紧跟在兄弟键名之后,需要使用更复杂的数组操作。
  • 如果数组中不存在指定的兄弟键名,则不会插入新的键/值对。

总结

该函数提供了一种简单而有效的方法,可以在 PHP 中递归地在多维数组中插入键/值对。通过理解其工作原理和注意事项,您可以将其应用于各种数据处理场景中。 记住,在使用该函数时,要考虑到其对原始数组的修改以及插入位置的限制。

以上就是PHP 递归地在多维数组中特定键后插入键/值对的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号