如何转换此*字符串:
$arrKeys = ['lev1', 'lev2', 'lev3'];
$val = 'foo';
进入以下数组:
Array
(
[lev1] => Array
(
[lev2] => Array
(
[lev3] => foo
)
)
)
*数组键的数量可能会有所不同。除最后一个之外的每个数组键代表数组。
谢谢!
答案 0 :(得分:3)
不需要递归:
$arrKeys = array_reverse(['lev1', 'lev2', 'lev3']);
$val = 'foo';
$result = $val;
foreach ($arrKeys as $key) {
$result = [$key => $result];
}
print_r($result);
// Array
// (
// [lev1] => Array
// (
// [lev2] => Array
// (
// [lev3] => foo
// )
//
// )
//
// )
只需从里到外构建数组。
答案 1 :(得分:2)
这是使用递归函数执行此操作的一种方法。这是我个人的最爱,因为它具有非常好的可读性。
function nest(array $keys, $value) {
if (count($keys) === 0)
return $value;
else
return [$keys[0] => nest(array_slice($keys, 1), $value)];
}
$result = nest(['key1', 'key2', 'key3'], 'foo');
print_r($result);
// Array
// (
// [key1] => Array
// (
// [key2] => Array
// (
// [key3] => foo
// )
// )
// )
或者您可以使用array_reduce
执行此操作。这种方式也很不错,但这里增加了一点复杂性,因为必须首先反转键数组。
function nest(array $keys, $value) {
return array_reduce(array_reverse($keys), function($acc, $key) {
return [$key => $acc];
}, $value);
}
$result = nest(['key1', 'key2', 'key3'], 'foo');
print_r($result);
// Array
// (
// [key1] => Array
// (
// [key2] => Array
// (
// [key3] => foo
// )
// )
// )
这两种解决方案适用于任意数量的密钥。即使$keys
是一个空数组
nest([], 'foo'); //=> 'foo'
答案 2 :(得分:1)
这是与其他迭代答案非常类似的方法,但是在$arrKeys
数组的末尾弹出值而不是在开头时将其反转。
$result = $val; // start with the innermost value
while ($level = array_pop($arrKeys)) {
$result = [$level => $result]; // build out using each key as a new level
}