【发布时间】:2015-09-09 13:08:40
【问题描述】:
我有一个:
$value = "val";
我也有一个数组:
$keys = ['key1', 'key2', 'key3'...]
该数组中的键是动态生成的,可以包含 2 到 10 个或更多条目。
我的目标是得到这个:
$array['key1']['key2']['key3']... = $value;
我该怎么做?
谢谢
【问题讨论】:
我有一个:
$value = "val";
我也有一个数组:
$keys = ['key1', 'key2', 'key3'...]
该数组中的键是动态生成的,可以包含 2 到 10 个或更多条目。
我的目标是得到这个:
$array['key1']['key2']['key3']... = $value;
我该怎么做?
谢谢
【问题讨论】:
最简单、最不混乱的方法(即不使用引用)是使用递归函数:
function addArrayLevels(array $keys, array $target)
{
if ($keys) {
$key = array_shift($keys);
$target[$key] = addArrayLevels($keys, []);
}
return $target;
}
//usage
$keys = range(1, 10);
$subArrays = addARrayLevels($keys, []);
它可以工作as you can see here。
工作原理其实很简单:
if ($keys) {:如果还有钥匙要加的话$key = array_shift($keys);从数组中移出第一个元素$target[$key] = addArrayLevels($keys, []);:将索引添加到$target,并使用$keys(在删除第一个值之后)再次调用相同的函数。这些递归调用将一直持续到$keys 为空,并且该函数仅返回一个空数组缺点:
专业人士:
$target 作为一种默认/最终赋值变量,不费吹灰之力(如果我有时间会在下面添加示例)使用上述函数的适配来在“最低”级别分配值的示例:
function addArrayLevels(array $keys, $value)
{
$return = [];
$key = array_shift($keys);
if ($keys) {
$return[$key] = addArrayLevels($keys, $value);
} else {
$return[$key] = $value;
}
return $return;
}
$keys = range(1, 10);
$subArrays = addARrayLevels($keys, 'innerValue');
var_dump($subArrays);
【讨论】:
我认为没有内置功能,但您可以使用简单的foreach 和引用来做到这一点。
$newArray = [];
$keys = ['key1', 'key2', 'key3'];
$reference =& $newArray;
foreach ($keys as $key) {
$reference[$key] = [];
$reference =& $reference[$key];
}
unset($reference);
var_dump($newArray);
【讨论】: