Как построить древовидный массив неограниченной вложенности?
Есть 2 массива. Первый массив это родители первого уровня, а второй потомки (родитель указан в ключе 'referer' ). Как их иерархически объединить в третий, при условии, что вложенность может быть условно неограниченной?
Массив 1 (родители первого уровня):
$array1 = [
['page'=>'1.ru', 'title'=>'—', 'childs'=>[]],
['page'=>'3.ru', 'title'=>'—', 'childs'=>[]],
['page'=>'6.ru', 'title'=>'—', 'childs'=>[]]
];
Массив 2 (потомки):
$array2 = [
['page'=>'666.ru', 'title'=>'+', 'referer'=>'66.ru'],
['page'=>'33.ru' , 'title'=>'+', 'referer'=>'3.ru'],
['page'=>'66.ru' , 'title'=>'+', 'referer'=>'6.ru']
];
Массив 3 (желаемый результат):
$array3 = [
['page'=>'1.ru', 'title'=>'—', 'childs'=>[]],
['page'=>'3.ru', 'title'=>'—', 'childs'=>[
['page'=>'33.ru' , 'title'=>'+', 'childs'=>[]],
]],
['page'=>'6.ru', 'title'=>'—', 'childs'=>[
['page'=>'66.ru' , 'title'=>'+', 'childs'=>[
['page'=>'666.ru', 'title'=>'+', 'childs'=>[]]
]]
]]
];
Ответы (1 шт):
Автор решения: E_K
→ Ссылка
- Сгруппировать дочерние элементы по родителю.
$array1 = [
['page' => '1.com', 'child' => []],
['page' => '2.com', 'child' => []],
['page' => '3.com', 'child' => []],
];
$array2 = [
['page' => '1-1.com', 'referer' => '1.com'],
['page' => '3-1.com', 'referer' => '3.com'],
['page' => '3-1-1.com', 'referer' => '3-1.com'],
['page' => '3-1-1-1.com', 'referer' => '3-1-1.com'],
];
$groupByParents = [];
foreach ($array2 as $item) {
$groupByParents[$item['referer']][] = $item;
}
- Рекурсивно заполнить родителя потомками
function fillParent(array $parents, array &$child): array
{
foreach ($parents as &$item) {
$item['child'] = fillParent($child[$item['page']] ?? [], $child);
}
return $parents;
}
Результат
$result = fillParent($array1, $groupByParents);
array:3 [▼
0 => array:2 [▼
"page" => "1.com"
"child" => array:1 [▼
0 => array:3 [▼
"page" => "1-1.com"
"referer" => "1.com"
"child" => []
]
]
]
1 => array:2 [▼
"page" => "2.com"
"child" => []
]
2 => array:2 [▼
"page" => "3.com"
"child" => array:1 [▼
0 => array:3 [▼
"page" => "3-1.com"
"referer" => "3.com"
"child" => array:1 [▼
0 => array:3 [▼
"page" => "3-1-1.com"
"referer" => "3-1.com"
"child" => array:1 [▼
0 => array:3 [▼
"page" => "3-1-1-1.com"
"referer" => "3-1-1.com"
"child" => []
]
]
]
]
]
]
]
]