如何走下阵列树将新键添加到同一级别?

时间:2017-08-01 18:40:00

标签: php recursion multidimensional-array

冷静下来,我正在努力正确地说出问题......所以请耐心等待。我试图使用foreach循环修改给定的数组,该循环以递归方式遍历每个数组键/值。但是,我不想替换键或值,而是需要将新键和值添加到与匹配键相同的级别。

在下面的代码中,我遍历数组中的每个键值,如果键和值匹配,我想将新键添加到匹配发生的同一级别。我可以找到匹配,但我不知道如何更新数组。我宁愿更新现有的数组而不是构建一个新数组。

这是我想要完成的事情

鉴于此数组:

array(
    array(
        'name' => 'name',
        'label' => 'Label'
    ),
    array(
        'name' => 'name',
        'label' => 'Label',
        'sub_fields' => array(
            array(
                'name' => 'my_desired_target',
                'label' => 'Label'
           )
        )
    )
);

function change_recursively($arr){

    foreach($arr as $key => $val){

        if(is_array($val)){

            change_recursively($val);

        }else{

            if($key == 'name' && $val == 'my_desired_target'){

                //How to add new key here?
                $arr['new_key'] = 'my new value';

            }

        }

    }

}

以下是我要查找的结果,如果我是var_dump $ arr。在这种情况下,键'name'和值'my_desired_target'匹配,新键'new_key'和值'my new value'被添加到同一级别。

array(
    array(
        'name' => 'name',
        'label' => 'Label'
    ),
    array(
        'name' => 'name',
        'label' => 'Label',
        'sub_fields' => array(
            array(
                'name' => 'my_desired_target',
                'label' => 'Label',
                'new_key' => 'my new value'
           )
        )
    )
)

我已经研究过使用array_walk_recursive和array_map,但是这两个函数似乎都没有跟踪你在数组中的深度。

1 个答案:

答案 0 :(得分:1)

使用参考:

有用的链接:PHP foreach change original array values

您的工作代码:

$arr = array(
    array(
        'name' => 'name',
        'label' => 'Label'
    ),
    array(
        'name' => 'name',
        'label' => 'Label',
        'sub_fields' => array(
            array(
                'name' => 'my_desired_target',
                'label' => 'Label'
            )
        )
    )
);

function change_recursively(&$arr){

    foreach($arr as $key => &$val){

        if(is_array($val)){

            change_recursively($val);

        }else{

            if($key == 'name' && $val == 'my_desired_target'){

                //How to add new key here?
                $arr['new_key'] = 'my new value';

            }

        }
    }
}
change_recursively($arr);
print_r($arr);

希望它有所帮助!