我正在尝试动态地在PHP中构建一个关联数组,而不是让我的策略正确。基本上,我想在数组结构中的某个深度插入一个值,例如:
$array['first']['second']['third'] = $val;
现在,问题是,我不确定该深度是否可用,如果不是,我想为每个级别创建键(和数组),最后将值插入正确的级别
由于我在代码中做了很多这样的事情,我厌倦了做一大堆“array_key_exists”,所以我想做一个为我构建数组的函数,给出一个关键字列表。任何有关良好战略的帮助都表示赞赏。我确信有一种非常简单的方法,我只是没有得到它......
答案 0 :(得分:8)
$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);
答案 1 :(得分:3)
创建一个类似的函数:
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
)
)
)
答案 2 :(得分:0)
这很棘手,你需要使用引用(或递归,但我 选择参考文献):
# 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];
}
}
答案 3 :(得分:0)
<?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
)
)
)
)