【问题标题】:How to walk down array tree adding new keys to same level?如何沿着数组树向下添加新键到同一级别?
【发布时间】:2018-01-08 18:26:13
【问题描述】:

首先,我正在努力正确地表达问题......所以请耐心等待。我正在尝试使用递归遍历每个数组键/值的 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,但是这两个函数似乎都无法跟踪您在数组中的深度。

【问题讨论】:

  • 我快到了,但我不知道如何完成它。这就像一堵砖墙在芬兰线上撞到了我。我有路径,但如何将其转换为数组地址? 3v4l.org/rmXQ2

标签: php recursion multidimensional-array


【解决方案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);

希望对你有帮助!

【讨论】:

  • @gdaniel 它对你有用吗?确保在 foreach 循环中也使用引用。这个想法是默认情况下foreach $value 是原始数组 $value 的副本。
  • 我曾尝试将作为引用传递给循环,但不是函数。让我试一试。
  • 当我在函数参数中添加“&”时,我得到“致命错误:无法通过引用传递参数 1”
  • 传递给函数的参数需要是变量smthng,如`change_recursively(['x'=>'y']);不会工作
  • 我会将答案标记为正确,因为它与我的代码隔离。不幸的是,我循环的数组是一个类属性,虽然 $arr 正在更新类属性,但它们不是,它们是相同的。感谢您对此进行调查。
猜你喜欢
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多