Как добавить ключи рекурсивно в каждый массив? - PullRequest
4 голосов
/ 06 июня 2019

У меня есть этот массив,

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, поэтому не могу думать о том, как и где отображать и почему.

Пожалуйста, помогите мне получить этот вывод.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

3 голосов
/ 06 июня 2019

Это хорошая домашняя задача на уроке программирования.При написании рекурсивной функции начните с кейса, который завершит ваше выполнение.Итак, предположим, что у меня есть мой массив, и я хочу «исправить» его:

$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;
}
1 голос
/ 06 июня 2019

@ kainaw ответ хорош, но это просто более простая версия для рекурсивного решения:

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

Обратите внимание на &, которые используют данные в качестве ссылки, поэтому исходный массив меняется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...