【问题标题】:How to add keys recursively to every array?如何递归地向每个数组添加键?
【发布时间】:2019-10-21 23:00:42
【问题描述】:

我有这个数组,

Array (
    [0] => Array (
        [P1] => Array (
            [P2] => Array (
                .
                    .
                        .
                            // n level
            ),
        ),
    ),
    [1] => Array (
        [P4] => Array (
            [P5] => Array (
                .
                    .
                        .
                            // n level
            ),
        ),
    ),
),

我想把它转换成这个数组

Array (
    [0] => Array (
        'id' => 0
        [P1] => Array (
            'id' => 'P1',
            [P2] => Array (
                    'id' => 'P2'
                .
                    .
                        .
                            // n level
            ),
        ),
    ),
    [1] => Array (
        'id' => '1'
        [P4] => Array (
            'id' => 'P4'
            [P5] => Array (
                'id' => 'P5'
                .
                    .
                        .
                            n level
            ),
        ),
    ),
),

如您所见,我获取了每个键并将其映射到数组的直接主体中的“id”。

这是我尝试过的,

function recursive_function($arr)
{
    $result = [];
    if (is_array($arr)) {
        foreach ($arr as $el) {
            $result = array_merge($result, recursive_function($el));
        }
    } else {
        $result[] = $input;
    }
    return $result;
}

我是递归函数和 PHP 的新手,所以无法思考如何映射、映射到哪里以及为什么。

请帮我得到这个输出。任何帮助将不胜感激。

【问题讨论】:

    标签: php arrays recursion multidimensional-array


    【解决方案1】:

    这是一道很好的编程课作业题。编写递归函数时,请从将结束执行的情况开始。所以,假设我有我的数组并且我想“修复”它:

    $old; // This is my array;
    $new = fix($old); // This takes my old array and gives me a fixed one.
    

    基本情况是当我的数组为空时。如果是这种情况,我只是将其退回,不做任何其他事情。

    function fix($a) {
      if(empty($a)) return $a;
    }
    

    如果它不为空,我需要循环遍历元素。如果元素不是数组,则不要对其执行任何操作。

    function fix($a) {
      if(empty($a)) return $a;
      foreach($a as $i=>$v) {
        if(!is_array($v)) // do nothing
      }
    }
    

    所以,如果 $v 是一个数组,我只想做一些事情。我想做什么?我想为其添加一个包含键的索引(我的代码中为 $i)。

    function fix($a) {
      if(empty($a)) return $a;
      foreach($a as $i=>$v) {
        if(is_array($v)) { // Only do something if $v is an array
          $a[$i]['id'] = $i;
        }
      }
    }
    

    快完成了。我们没有递归调用。因为 $v 是一个数组,所以它也需要修复。这很容易做到:

    function fix($a) {
      if(empty($a)) return $a;
      foreach($a as $i=>$v) {
        if(is_array($v)) { // Only do something if $v is an array
          $a[$i] = fix($v);
          $a[$i]['id'] = $i;
        }
      }
    }
    

    现在,$v 将被修复并替换它在数组中的旧自我。然后,将添加 id 索引。但是,有一些重要的事情要做。我们需要返回固定的数组!

    function fix($a) {
      if(empty($a)) return $a;
      foreach($a as $i=>$v) {
        if(is_array($v)) { // Only do something if $v is an array
          $a[$i] = fix($v);
          $a[$i]['id'] = $i;
        }
      }
      return $a;
    }
    

    【讨论】:

      【解决方案2】:

      @kainaw 的答案很好,但这只是递归解决方案的简单版本:

      function addId(&$arr) {
          foreach($arr as $k => &$v) {
              addId($v);
              $v = array_merge(["id" => $k], $v);
          }
      }
      $arr = [["P1" => ["P2" => []]], ["P4" => ["P5" => []]]];
      addId($arr);
      

      注意& 使用数据作为参考,因此原始数组正在发生变化

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 2020-03-16
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        • 2020-07-06
        相关资源
        最近更新 更多