Здравствуйте! Как объединить вложенные массивы?

Мне нужно, что бы вложенный массив у которого ключ "parent" равен ключу "id" из другого вложенного массива становился вложенным массивом "child" этого массива.

Есть исходный массив:

$sourceArray = [
  [
    "id" => "1",
    "parent" => "0",
    "title" => "Первая вложенность",
    "url" => "#1",
  ],
  [
    "id" => "2",
    "parent" => "1",
    "title" => "Вторая вложенность",
    "url" => "#2",
  ],
  [
    "id" => "3",
    "parent" => "2",
    "title" => "Третья вложенность",
    "url" => "#3",
  ],
  [
    "id" => "4",
    "parent" => "3",
    "title" => "Четвертая вложенность",
    "url" => "#4",
  ],
];

Нужно, что бы получилось так:

$finalArray = [
  [
    "id" => "1",
    "parent" => "0",
    "title" => "Первая вложенность",
    "url" => "#1",
    "child" => [
      "id" => "2",
      "parent" => "1",
      "title" => "Вторая вложенность",
      "url" => "#2",
      "child" => [
        "id" => "3",
        "parent" => "2",
        "title" => "Третья вложенность",
        "url" => "#3",
        "child" => [
          "id" => "4",
          "parent" => "3",
          "title" => "Четвертая вложенность",
          "url" => "#4",
        ],
      ],
    ],
  ],
];

Ответы (1 шт):

Автор решения: de-gard

Написал для вас решение:

/**
* Прокручиваю главные элементы, те у которых parent == 0
*/
$newArray = [];

foreach ($array as $key => $item)
{
  if($item["parent"] == '0')
  {
    $newArray[$item["id"]] = $item;

    if($array[$key+1]["parent"] == $item["id"])
    {
      $newArray[$item["id"]]["child"] = getChild($array, $item["id"], $key+1);
    }
  }

}

/**
* Прокручиваю дочерние элементы, те у которых parent != 0
*/
function getChild($array, $parent, $key)
{
  $i = $key;
  $secArray = [];

  while(!empty($array[$i]))
  {
    if($array[$i]["parent"] == $parent)
    {
      $secArray[$array[$i]["id"]] = $array[$i];

      if($array[$i+1]["parent"] == $array[$i]["id"])
      {
        $secArray[$array[$i]["id"]]["child"] = getChild($array, $array[$i]["id"], $i+1);
      }
    }
    elseif($array[$i]["parent"] == '0')
    {
      break;
    }
    $i++;
  }

  return $secArray;
}

Пришлось воспользоваться рекурсией с циклами. В foreach вместо массива $array подставьте свою переменную.

→ Ссылка