【问题标题】:Optimize multidimensional array creation优化多维数组创建
【发布时间】:2019-05-31 10:35:06
【问题描述】:

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

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

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

【问题讨论】:

  • 值是什么?是静态字符串'value'吗?
  • 你在哪里有value?这是数组中的最后一项吗?
  • 我建议使用递归函数 - 但从最后一项 (key2) 到第一项 (key0)。或者也许只是从最后一项开始的循环就可以了。
  • @Dharman 我在问题的底部说值无关紧要。我能够填充那部分,这是我无法优化的键的排列。

标签: php arrays optimization multidimensional-array


【解决方案1】:

您可以向后遍历您的输入数组并在执行过程中包装上一个结果:

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

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

【讨论】:

  • 其中几个回答了我的问题,但你是第一个。就可以了!
【解决方案2】:

试试这个。这里我们使用引用来堆叠我们的新数组。

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

【讨论】:

    【解决方案3】:

    您可以从最后一个 Item 开始循环遍历数组,弹出最后一个并构建新数组:

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

    【讨论】:

      【解决方案4】:

      另一种选择是循环反转键并包装先前的结果:

      $array = [];
      foreach(array_reverse($keys) as $key) {
          $temp = $array;
          unset($array[key($array)]);
          $array[$key] = $temp;
      }
      

      然后你可以设置你的值:

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

      Demo

      【讨论】:

        【解决方案5】:

        您甚至可以以一种安全的方式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;' );
        

        【讨论】:

          猜你喜欢
          • 2014-05-30
          • 2023-03-30
          • 1970-01-01
          • 2011-08-19
          • 2013-04-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多