我在一个数组中有一组数组键和嵌套级别,例如:
$keys[0] = 'first';
$keys[1] = 'second';
$keys[2] = 'third';
如何将其转换为以下格式的多维数组:
$array['first']['second']['third'] = 'value';
我尝试了几种无法解决的变体,并且按键覆盖了自己。最简单的方法是对键的数量进行计数并手动覆盖每种情况,但这几乎没有优化,并且不会动态增长。
$keyLen = count($keys);
if ($keyLen == 1) {
$array[$keys[0]] = 'value;
} elseif ($keyLen == 2) {
$array[$keys[0]][$keys[1]] = 'value;
} elseif ($keyLen == 3) {
$array[$keys[0]][$keys[1]][$keys[2]] = 'value';
} ...
请注意,该值并不重要,它是数组键的嵌套,因此我无法更改初始数组格式。
答案 0 :(得分:3)
您可以向后浏览输入数组,并随行包装上一个结果:
$nested = 'value';
for (end($keys); key($keys)!==null; prev($keys)){
$nested = [current($keys) => $nested];
}
$nested
最后将具有所需的结构。
答案 1 :(得分:1)
尝试一下。在这里,我们使用引用来堆叠我们的新数组。
<?php
$keys = array('first', 'second', 'third');
$array = array();
$current = &$array;
foreach($keys as $key => $value) {
$current[$value] = array();
$current = &$current[$value];
}
$current = 'Hello world!';
print_r($array);
答案 2 :(得分:0)
从最后一个项目开始,您可以遍历数组,弹出最后一个并构建新的数组:
<?php
$keys[0] = 'first';
$keys[1] = 'second';
$keys[2] = 'third';
function createKey($array) {
$b = "value";
while(count($array)>0) {
$key = array_pop($array);
$b = [$key => $b];
}
return $b;
}
var_dump(createKey($keys));
// Output:
array(1) {
["first"]=>
array(1) {
["second"]=>
array(1) {
["third"]=>
string(5) "value"
}
}
}
答案 3 :(得分:0)
另一种选择是循环反转键并包装先前的结果:
$array = [];
foreach(array_reverse($keys) as $key) {
$temp = $array;
unset($array[key($array)]);
$array[$key] = $temp;
}
然后您可以设置值:
$array['first']['second']['third'] = 'value';
答案 4 :(得分:0)
您甚至可以安全的方式eval
,而不会将任何输入数据泄漏到eval字符串中:
$value = 'value';
eval( '$array[$keys['. implode(']][$keys[', range(0, count($keys)-1)) . ']] = $value;' );
或带有一个更简单,更短的计数器:
$value = 'value';
$i = 0;
eval( '$array' . str_repeat('[$keys[$i++]]', count($keys)) . ' = $value;' );