【问题标题】:PHP - dynamically add dimensions to arrayPHP - 动态添加维度到数组
【发布时间】:2015-09-09 13:08:40
【问题描述】:

我有一个:

$value = "val";

我也有一个数组:

$keys = ['key1', 'key2', 'key3'...]

该数组中的键是动态生成的,可以包含 2 到 10 个或更多条目。

我的目标是得到这个:

$array['key1']['key2']['key3']... = $value;

我该怎么做?

谢谢

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    最简单、最不混乱的方法(即不使用引用)是使用递归函数:

    function addArrayLevels(array $keys, array $target)
    {
          if ($keys) {
              $key = array_shift($keys);
              $target[$key] = addArrayLevels($keys, []);
          }
          return $target;
    }
    
    //usage
    $keys = range(1, 10);
    $subArrays = addARrayLevels($keys, []);
    

    它可以工作as you can see here

    工作原理其实很简单:

    • if ($keys) {:如果还有钥匙要加的话
    • $key = array_shift($keys);从数组中移出第一个元素
    • $target[$key] = addArrayLevels($keys, []);:将索引添加到$target,并使用$keys(在删除第一个值之后)再次调用相同的函数。这些递归调用将一直持续到$keys 为空,并且该函数仅返回一个空数组

    缺点:

    • 递归一开始可能很难理解,尤其是在复杂的函数中,在不是你写的代码中,但是把它记录好,你应该没问题

    专业人士:

    • 更灵活(您可以使用$target 作为一种默认/最终赋值变量,不费吹灰之力(如果我有时间会在下面添加示例)
    • 没有要处理的reference mess and risks

    使用上述函数的适配来在“最低”级别分配值的示例:

    function addArrayLevels(array $keys, $value)
    {
          $return = [];
          $key = array_shift($keys);
          if ($keys) {
              $return[$key] = addArrayLevels($keys, $value);
          } else {
              $return[$key] = $value;
          }
          return $return;
    }
    
    $keys = range(1, 10);
    $subArrays = addARrayLevels($keys, 'innerValue');
    var_dump($subArrays);
    

    Demo

    【讨论】:

      【解决方案2】:

      我认为没有内置功能,但您可以使用简单的foreach 和引用来做到这一点。

      $newArray = [];
      $keys = ['key1', 'key2', 'key3'];
      $reference =& $newArray;
      
      foreach ($keys as $key) {
          $reference[$key] = [];
      
          $reference =& $reference[$key];
      }
      
      unset($reference);
      
      var_dump($newArray);
      

      【讨论】:

      • @JeremyBelolo:请阅读我的 "pro's" 列表中的链接答案以获得解释,但请相信我:尽可能避免引用 i>,你真的可以在这里避免它们
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2020-09-28
      相关资源
      最近更新 更多