动态更新具有未知数量嵌套的php数组

时间:2018-07-27 09:02:55

标签: php arrays

我有一个存储其他嵌套数组的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中。

3 个答案:

答案 0 :(得分:3)

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

简单地连续创建数组键的引用,并在最后分配值。

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上查看它的运行情况

答案 1 :(得分:1)

很酷的问题。我会写这样的递归函数:

function array_put(&$array, $path, $value, $ix = 0) {
 $path_ex = explode('_', $path);
 if ($ix == count($path_ex) - 1) {
  $array[$path_ex[$ix]] = $value;
  return;
 }
 else {
  array_put($array[$path_ex[$ix]], $path, $value, $ix+1);
 }
}

$data = [];
array_put($data, 'a_b_c_x', 'test');
array_put($data, 'a_b_c_y', []);
array_put($data, 'a_b_c_z_p', 123);
array_put($data, 'a_b_d', null);

var_dump($data);

Try it online!

答案 2 :(得分:0)

对不起,代码中有一个愚蠢的错误。我使用了“ array_search”,而我本应使用“ array_key_exists”。