首页 > 解决方案 > 使用未知数量的嵌套动态更新 php 数组

问题描述

我有一个存储其他嵌套数组的 php 数组。要插入数组的数据以“a_b_c_x”、“a_b_c_y”、“a_b_c_z_p”、“a_b_d”等形式发送。上面提到的四个字符串需要存储在一个数组中:

[
  a = [
    b = [
      c = [
        x = [],
        y = [],
        z = [
          p = []
        ]
      ],
      d = []
    ] 
  ]
]

数组可以有未知数量的嵌套。我需要解析字符串以搜索现有键并添加新键。我试过类似的东西:

foreach($productConfigurationAdd as $toAdd) {
    $addArray = explode('_', $toAdd);

    $addTo = &$savedConfigurations;

    foreach($addArray as $addElem) {
        if(array_search($addElem, $addTo) === false) {
            $addTo[$addElem] = [];
            $addTo = &$addTo[$addElem];
        }
        else {
            $addTo = &$addTo[$addElem];
        }
    }
}

它只保存每个块的第一个孩子。请让我知道这里出了什么问题。

编辑:

在上面的代码中,$savedConfigurations是从数据库中获取的数组,如果添加字符串包含新的配置,则$savedConfigurations按照问题中的说明进行存储。

标签: phparrays

解决方案


解决方案非常简单。不需要递归函数。

只需依次创建数组键的引用,最后赋值即可。

function put(&$var, $path, $value) {
    foreach(explode('_', $path) as $p) $var =& $var[$p];
    $var = $value;
}

使用示例:

$data = [];

put($data, 'a_b_c_x', 'foo');
put($data, 'a_b_c_y', 'bar');
put($data, 'a_b_c_z_p', [123]);
put($data, 'a_b_d', 456.789);

print_r($data);

输出:

Array
(
    [a] => Array
        (
            [b] => Array
                (
                    [c] => Array
                        (
                            [x] => foo
                            [y] => bar
                            [z] => Array
                                (
                                    [p] => Array
                                        (
                                            [0] => 123
                                        )

                                )

                        )

                    [d] => 456.789
                )

        )

)

在https://3v4l.org/Q7SIq上查看它的实际应用


推荐阅读