$array1 = [
['page'=>'1.ru', 'title'=>'—', 'childs'=>[]],
['page'=>'3.ru', 'title'=>'—', 'childs'=>[]],
['page'=>'6.ru', 'title'=>'—', 'childs'=>[]]
];
$array2 = [
['page'=>'666.ru', 'title'=>'+', 'referer'=>'66.ru'],
['page'=>'33.ru' , 'title'=>'+', 'referer'=>'3.ru'],
['page'=>'66.ru' , 'title'=>'+', 'referer'=>'6.ru']
];
$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'=>[]]
]]
]]
];
вложенность мотет быть неограниченной
const array1 = [
{page: '1.ru', title: 'title 1'},
{page: '3.ru', title: 'title 3'},
{page: '6.ru', title: 'title 6'},
];
const array2 = [
{page: '666.ru', title: 'title 666', referer: '66.ru'},
{page: '33.ru', title: 'title 33', referer: '3.ru'},
{page: '66.ru', title: 'title 66', referer: '6.ru'},
];
function createTree(roots, notRoots) {
if (!roots || !roots.length) { return []; }
const childsMap = new Map();
// строим карту (page => список_чилдов), создавая узлы дерева для чилдов
notRoots.forEach((child) => {
let childs = childsMap.get(child.referer);
if (!childs) {
childs = [];
childsMap.set(child.referer, childs);
}
childs.push({
page: child.page,
title: child.title,
});
});
// всем чилдам (вновь созданным узлам), которые попали в карту, проставляем чилдов
childsMap.forEach((childs) => {
childs.forEach((child) => {
child.childs = childsMap.get(child.page) || [];
})
});
// обходим корневые элементы, создаем для них узлы дерева, подставляем чилды по карте
return roots.map((root) => {
return {
page: root.page,
title: root.title,
childs: childsMap.get(root.page) || []
};
})
}
console.log(createTree(array1, array2));
Как
$tree = $array1;
$array = $array2;
//вытаскивает значения из массива с детьми, и если место куда вставить ребёнка не нашлось, помещает его в конец
//Внимание! Функция войдёт в рекурсию, если места для ребёнка не найдётся - этот момент нужно фиксить
function one(array &$tree, array &$array) {
//if (empty($array)) return false;
$search = array_shift($array);
$temp = $tree;
$tree = two($tree, $search);
if (serialize($tree) == serialize($temp)) $array[] = $search;
if (!empty($array)) one($tree, $array);
}
//ищет куда вставить детей
function two(array $array, array $search) {
$tree = [];
foreach($array as $key => $value) {
$tree[$key] = $value;
if ($value['page'] == $search['referer']) {
$tree[$key]['childs'][] = $search;
} elseif (!empty($value['childs'])) {
$tree[$key]['childs'] = two($array[$key]['childs'], $search);
}
}
return $tree;
}
one($tree, $array);
var_dump($tree);