Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何向每个数组递归添加键?_Php_Arrays_Recursion_Multidimensional Array - Fatal编程技术网

Php 如何向每个数组递归添加键?

Php 如何向每个数组递归添加键?,php,arrays,recursion,multidimensional-array,Php,Arrays,Recursion,Multidimensional Array,我有这个数组 Array ( [0] => Array ( [P1] => Array ( [P2] => Array ( . . . // n level ), ), ), [1] => Arr

我有这个数组

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的东西,所以无法思考如何映射、映射到哪里以及为什么


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

这是一个很好的编程类家庭作业问题。编写递归函数时,请从结束执行的案例开始。因此,假设我有我的数组,我想“修复”它:

基本情况是数组为空。如果是这样的话,我就把它退回,别的什么也不做

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在我的代码中)的索引

差不多完成了。我们没有递归调用。因为$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将被修复,并替换数组中的旧self。然后,将添加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;
}

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

function addId(&$arr) {
    foreach($arr as $k => &$v) {
        addId($v);
        $v = array_merge(["id" => $k], $v);
    }
}
$arr = [["P1" => ["P2" => []]], ["P4" => ["P5" => []]]];
addId($arr);
请注意
&
,它使用数据作为参考,因此原始数组正在更改

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;
}
function addId(&$arr) {
    foreach($arr as $k => &$v) {
        addId($v);
        $v = array_merge(["id" => $k], $v);
    }
}
$arr = [["P1" => ["P2" => []]], ["P4" => ["P5" => []]]];
addId($arr);