Добрый день, мне нужно собрать массив данных такого вида
$test = [
['title' => 'test1', 'url' => 'test1'],
['title' => 'test2', 'url' => 'test2'],
[
'title' => 'test3',
'url' => 'test3',
'children' => [
[
'title' => 'test4',
'url' => 'test3/test4',
'children' => [
[
'title' => 'test5',
'url' => 'test3/test4/test5',
]
]
],
]
],
['title' => 'test6', 'url' => 'test6'],
];
Исходные данные такие
$data = [
[
'id' => 1,
'parent_id' => 0,
'name' => 'test1',
'url' => 'test1',
],
[
'id' => 2,
'parent_id' => 0,
'name' => 'test2',
'url' => 'test2',
],
[
'id' => 3,
'parent_id' => 0,
'name' => 'test3',
'url' => 'test3',
],
[
'id' => 4,
'parent_id' => 3,
'name' => 'test4',
'url' => 'test3/test4',
],
[
'id' => 5,
'parent_id' => 4,
'name' => 'test5',
'url' => 'test3/test4/test5',
],
[
'id' => 6,
'parent_id' => 0,
'name' => 'test6',
'url' => 'test6',
],
];
Собираю почти нужный мне массив 2 функциями
public function recarray($arr, $data) {
foreach ($arr as $k => $val) {
if($k === (int)$data['parent_id']){
$arr[$k]['children'][(int)$data['id']] = [
'title' => $data['name'],
'url' => $data['url']
];
}elseif (is_array($arr[$k])){
$ret = $this->recarray($arr[$k], $data);
if (count($ret)) $arr[$k] = $ret;
}
}
return $arr;
}
public function getTestArr(){
$tree = [];
foreach ($data as $k=>$v) {
if(@$v['parent_id']){
$tree = $this->recarray($tree, $v);
}else{
$tree[$v['id']] = [
'title' => $v['name'],
'url' => $v['url'],
];
}
}
return $tree;
}
С помощью моего метода массив собирается, но чуток не в том виде, ключи расставляет согласно id - а мне же нужно чтоб они шли последовательно от 0....n как на примере выше, какие у кого мысли?
вот такой результат я получаю
Array
(
[1] => Array
(
[title] => test1
[url] => test1
)
[2] => Array
(
[title] => test2
[url] => test2
)
[3] => Array
(
[title] => test3
[url] => test3
[children] => Array
(
[4] => Array
(
[title] => test4
[url] => test3/test4
[children] => Array
(
[5] => Array
(
[title] => test5
[url] => test3/test4/test5
)
)
)
)
)
[6] => Array
(
[title] => test6
[url] => test6
)
)
Решить конечно задачку можно с помощью, еще одного перебора получившегося массива!!! Но не в этом вопрос - а в том чтоб этого избежать и найти лучший способ