Php 优化多维数组创建

Php 优化多维数组创建,php,arrays,optimization,multidimensional-array,Php,Arrays,Optimization,Multidimensional Array,我在一个数组中有一个数组键和嵌套级别的列表,例如: $keys[0] = 'first'; $keys[1] = 'second'; $keys[2] = 'third'; 如何将其转换为以下格式的多维数组: $array['first']['second']['third'] = 'value'; 我尝试了两种不同的变体,但都没有成功,而且按键本身也写得太多了。最简单的方法是获得密钥数并手动覆盖每个场景,但这很难优化,也不会动态增长 $keyLen = count($keys); if

我在一个数组中有一个数组键和嵌套级别的列表,例如:

$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';
} ...

需要注意的是,该值并不重要,它是数组键的嵌套,我无法更改初始数组格式。

您可以向后查看输入数组,并在执行时包装上一个结果:

$nested = 'value';
for (end($keys); key($keys)!==null; prev($keys)){
    $nested = [current($keys) => $nested];
}

最后,
$nested
将具有所需的结构。

尝试一下。这里我们使用引用来堆叠新数组

<?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);

从最后一项开始,您可以在数组中循环,弹出最后一项并构建新数组:

<?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"
    }
  }
}

另一个选项是循环反转的关键帧并包装上一个结果:

$array = [];
foreach(array_reverse($keys) as $key) {
    $temp = $array;
    unset($array[key($array)]);
    $array[$key] = $temp;
}
然后您可以设置您的值:

$array['first']['second']['third'] = 'value';

您甚至可以
以安全的方式对其进行求值,而不会将任何输入数据泄漏到求值字符串中:

$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;' );

价值观是什么?它是一个静态字符串
'value'
?在哪里有
?这是数组中的最后一项?我建议使用一个补偿函数-但是从最后一项(键2)到第一项(键0)。或者从最后一项开始循环就可以了。@Dharman我在问题的底部说,值并不重要。我可以填充这部分,这是我无法优化的键的排列。有几个键回答了我的问题,但你是第一个。那就行了!