我有一个存储其他嵌套数组的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
中。
答案 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);
答案 2 :(得分:0)
对不起,代码中有一个愚蠢的错误。我使用了“ array_search”,而我本应使用“ array_key_exists”。