题
我试图动态构建在PHP关联数组,并没有完全得到我的策略吧。基本上,我想在阵列结构一定深度,以插入一个值,例如:
$array['first']['second']['third'] = $val;
现在,事情是,我不知道如果深度是可用的,如果实在不行,我要创建每个级别的键(和数组),终于在正确的水平插入值
由于我这样做了很多在我的代码,我已经厌倦了做了一大堆“array_key_exists”的,所以我想这样做,建立对我来说,数组的函数,给出的级别键列表。在一个很好的策略这方面的任何帮助表示赞赏。我敢肯定有一个非常简单的方法,我只是没有得到它...
解决方案
PHP不怪你,如果你这样做只是让
$array['first']['second']['third'] = $val;
print_r($array);
如果你不希望你的按键被硬编码呢,这里有一个灵活的解决方案。
/// locate or create element by $path and set its value to $value
/// $path is either an array of keys, or a delimited string
function array_set(&$a, $path, $value) {
if(!is_array($path))
$path = explode($path[0], substr($path, 1));
$key = array_pop($path);
foreach($path as $k) {
if(!isset($a[$k]))
$a[$k] = array();
$a = &$a[$k];
}
$a[$key ? $key : count($a)] = $value;
}
// example:
$x = array();
array_set($x, "/foo/bar/baz", 123);
array_set($x, "/foo/bar/quux", 456);
array_set($x, array('foo', 'bah'), 789);
其他提示
创建像一个函数:
function insert_into(&$array, array $keys, $value) {
$last = array_pop($keys);
foreach($keys as $key) {
if(!array_key_exists($key, $array) ||
array_key_exists($key, $array) && !is_array($array[$key])) {
$array[$key] = array();
}
$array = &$array[$key];
}
$array[$last] = $value;
}
用法:
$a = array();
insert_into($a, array('a', 'b', 'c'), 1);
print_r($a);
输出:
Array
(
[a] => Array
(
[b] => Array
(
[c] => 1
)
)
)
这是棘手的,你需要用引用(或使用递归的工作,但我 这里选择的参考文献):
# Provide as many arguments as you like:
# createNestedArray($array, 'key1', 'key2', etc.)
function createNestedArray(&$array) {
$arrayCopy = &$array;
$args = func_get_args();
array_shift($args);
while (($key = array_shift($args)) !== false) {
$arrayCopy[$key] = array();
$arrayCopy = &$arrayCopy[$key];
}
}
<?php
function setElements(&$a, array $path = [], $values = [])
{
if (!is_array($path)) {
$path = explode($path[0], substr($path, 1));
}
$path = "[ '" . join("' ][ '", $path) . "' ]";
$code =<<<CODE
if(!isset(\$a{$path})){
\$a{$path} = [];
}
return \$a{$path}[] = \$values;
CODE;
return eval($code);
}
$a = [];
setElements($a, [1,2], 'xxx');
setElements($a, [1,2,3], 233);
setElements($a, [1,2,4], 'AAA');
setElements($a, [1,2,3,4], 555);
print_r($a);
输出
Array
(
[1] => Array
(
[2] => Array
(
[0] => xxx
[3] => Array
(
[0] => 233
[4] => Array
(
[0] => 555
)
)
[4] => Array
(
[0] => AAA
)
)
)
)
您应该点击此处查看 http://sandbox.onlinephpfunctions.com/
不隶属于 StackOverflow