如何转换这个*字符串:
$arrKeys = ['lev1', 'lev2', 'lev3'];
$val = 'foo';
插入到以下数组中:
Array
(
[lev1] => Array
(
[lev2] => Array
(
[lev3] => foo
)
)
)
*数组键的数量可能不同。除最后一个键外,每个数组键都代表array。
谢谢!
无需递归:
$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
// )
//
// )
//
// )
从内到外构建数组
这里有一种使用递归函数的方法。这是我个人最喜欢的,因为它有很好的可读性。
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'
这是一种与其他迭代答案非常相似的方法,但是从$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
}