Задать вопрос
@frmax
человек

Есть лучше метод перебора массива?

Добрый день, мне нужно собрать массив данных такого вида
$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
        )

)


Решить конечно задачку можно с помощью, еще одного перебора получившегося массива!!! Но не в этом вопрос - а в том чтоб этого избежать и найти лучший способ
  • Вопрос задан
  • 186 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
AlexMaxTM
@AlexMaxTM
Вместо вашей строки $tree[$v['id']] = [... используйте $tree[] = [...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы