Здравствуйте! Как объединить вложенные массивы?
Мне нужно, что бы вложенный массив у которого ключ "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 подставьте свою переменную.