@BushaevDenis

Как найти значение в многомерном массиве и вернуть полный путь?

Добрый день.
Есть массив вида
$array = [
    [
        '100', //допустим, id
        'Фрукты', //Название
        [
            '101',
            'Цитрусовые',
            [
                [
                    '102',
                    'Апельсин'
                ],
                [
                    '103',
                    'Мандарин',
                ]
            ]
        ]
    ],
    [
        '103',
        'Овощи',
        [
            '104',
            'Корнеплоды',
            [
                [
                    '105',
                    'Картофель'
                ],
                [
                    '106',
                    'Морковь',
                ]
            ]
        ]
    ],
];

Вопрос, как осуществить поиск и вернуть полный путь по названию.
Допустим, я ищу Морковь.
$heystack = '106';
var_dump(search_category($heystack, $array));

Чтоб возвращал Массив такого вида.
array(['Овощи', 'Корнеплоды', 'Морковь']);

Получилось сделать только поиск.
function parse_categories($heystack, $array) {

    foreach ($array as $row) {
        if ($heystack == $row[0]) {
            return $row[1];
        } else {
            foreach ($row as $subrow) {
                if (is_array($subrow[0])) {
                    $return = parse_categories($heystack, $subrow);
                    if ($return !== null) {
                        return $return;
                    }
                }
            }
        }
    }
    return null;
}

(Не обращайте внимания на проверку "is_array" там немного другая структура, но суть не меняется.).
  • Вопрос задан
  • 670 просмотров
Решения вопроса 1
@BorisKorobkov Куратор тега PHP
Web developer
return $return;

замените на
return array_merge($row[1], $return);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@novrm
Не уверен, но вы не в тут степь идете.
Извините, если не правильно понял.

В вашем случае, как мне кажется, нужно делать нечто другое.

$array = [
    [
        'id' => '100', //допустим, id
        'name' => 'Фрукты', //Название
        'sub_category' => [
            'id' => '101',
            'name' => 'Цитрусовые',
            'product' => [
                [
                    'id' => '102',
                    'name' => 'Апельсин'
                ],
                [
                    'id' => '103',
                    'name' => 'Мандарин',
                ]
            ]
        ]
    ],
    [
        'id' => '103',
        'name' => 'Овощи',
        'sub_category' => [
            'id' => '104',
            'name' => 'Корнеплоды',
            'product' => [
                [
                    'id' => '105',
                    'name' => 'Картофель'
                ],
                [
                    'id' => '106',
                    'name' => 'Морковь',
                ]
            ]
        ]
    ],
];


... и копать здесь...

$iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array));

$names = [];
foreach ($iterator as $name) {
    $depth = floor($iterator->getDepth()/2);

    $names[$depth] = $name;

    echo implode(' > ', array_slice($names, 0, $depth + 1)), '<br>', PHP_EOL;
}
Ответ написан
Ваш ответ на вопрос

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

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