【问题标题】:How to set a list of values as keys in a multidimensional associative array?如何将值列表设置为多维关联数组中的键?
【发布时间】:2017-12-18 07:12:04
【问题描述】:

我想转换一个值列表,例如:

$foo = ['a', 'b', 'c']; 

进入遍历数组键的列表如:

$bar['a']['b']['c'] = 123;

如何创建一个关联数组,其中的键基于存储在另一个数组中的一组值?

【问题讨论】:

  • 你试过了吗?也发布你的努力。
  • 您可以使用 for 循环来实现。
  • 123 是从哪里来的?如果输入是['a', 'b', 'c', 'd'];,那会是输出$bar['a']['b']['c']['d']吗?它还会是 123 吗?还是 1234?
  • 值'123'将在创建数组键后的最后设置

标签: php arrays multidimensional-array


【解决方案1】:

你可以参考一下。试试这个代码,live demo

<?php
$foo = ['a', 'b', 'c']; 
$array = [];
$current = &$array;
foreach($foo as $key) {
  @$current = &$current[$key];
}
$current = 123;
print_r($array);

【讨论】:

    【解决方案2】:

    我会这样做:

    $foo = ['a', 'b', 'c']; 
    $val = '123';
    foreach (array_reverse($foo) as $k => $v) {
        $bar = [$v => $k ? $bar : $val];
    }
    

    我们正在反向迭代数组并首先分配最里面的值,然后从内到外构建数组。

    【讨论】:

      【解决方案3】:

      这里是另一个选项:创建一个临时可解析字符串(通过提取第一个值,然后将剩余的值附加为方括号包裹的字符串),调用parse_str(),并将输出变量设置为$bar

      代码:(Demo)

      $foo = ['a', 'b', 'c'];
      $val=123;
      
      parse_str(array_shift($foo).'['.implode('][',$foo)."]=$val",$bar);
      // built string: `a[b][c]=123`
      var_export($bar);
      

      输出:

      array (
        'a' => 
        array (
          'b' => 
          array (
            'c' => '123',
          ),
        ),
      )
      

      如果第一种方法感觉太 hack-ish,那么以下递归方法是一种稳定的方法:

      代码:(Demo)

      function nest_assoc($keys,$value){
          return [array_shift($keys) => (empty($keys) ? $value : nest_assoc($keys,$value))];
          //      ^^^^^^^^^^^^^^^^^^--------------------------------------------------------extract leading key value, modify $keys
          //  check if any keys left-----^^^^^^^^^^^^
          //  no more keys, use the value---------------^^^^^^
          //  recurse to write the subarray contents-------------^^^^^^^^^^^^^^^^^^^^^^^^^
      }
      
      $foo=['a','b','c'];
      $val=123;
      
      var_export(nest_assoc($foo,$val));
      // same output
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-31
        • 1970-01-01
        • 2014-05-26
        • 2021-01-06
        相关资源
        最近更新 更多