Получить полный путь к ключу массива PHP

94
24 апреля 2021, 07:20

Есть массив:

$array = array(
    '0' => array(
        'KY0' => array(
            'k2' => array(
                'k3' => 0,
                'k4' => 1,
                'k5' => array(
                    'k6' => 1,
                    'k7' => 2,
                        'k8' => array(
                            'k9' => 9,
                        ),
                    'k10' => array(
                            'k11' => 4,
                            'k12' => 1,
                        ),
                ),
            ),
        ),
        'KY1' => array(
            'k2' => array(
                'k10' => 0
            ),
        ),
    ),
    '1' => array(
        'k10' => 6
    )
);

Мне необходимо найти например все ключи "k10" и вернуть их полный путь в виде нового массива.

Пытаюсь это сделать рекурсивным итератором:

    function FindPath(array $array, $SearchKey) {
        $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array), RecursiveIteratorIterator::CHILD_FIRST);
        foreach ($iterator as $key => $current) {
            if ($key == $SearchKey || $iterator->getDepth() < $depth) {
                $s[] = $key;
                if ($iterator->getDepth() == 0) {
                    $path[] = array_reverse($s);
                    $s = [];
                }
                $depth = $iterator->getDepth();
            }
        }
        return $path;
    }
print_r(FindPath($array, 'k10'));

Но на выходе получаю такой массив:

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => KY1
            [2] => k2
            [3] => k10
            [4] => KY0
            [5] => k2
            [6] => k5
            [7] => k10
        )
    [1] => Array
        (
            [0] => 1
            [1] => k10
        )
)

Подскажите пожалуйста как мне получить массив следующего вида:

 Array
    (
        [0] => Array
            (
                [0] => 0
                [1] => KY0
                [2] => k2
                [3] => k5
                [4] => k10
            )
        [1] => Array
            (
                [0] => 0
                [1] => KY1
                [2] => k2
                [3] => k10
            )
        [2] => Array
            (
                [0] => 1
                [1] => k10
            )
    )
Answer 1

Бежим рекурсивно по массиву и добавляем в каждой итерации ключ в $path

После итерации убираем из $path последний элемент, чтобы в след цикле был верный путь

Когда встречаем ключ, который мы ищем - добавляем найденный $path в $paths

$paths = [];
fillPaths($array, 'k10', $paths);
var_dump($paths);
function fillPaths($array, $searchKey, &$paths = [], &$path = []) {
    foreach ($array as $key => $values) {
        $path[] = $key;
        if ($key === $searchKey) {
            $paths[] = $path;
        }
        if (is_array($values)) {
            fillPaths($values, $searchKey, $paths, $path);
        }
        array_pop($path);
    }
}
READ ALSO
Как программно создавать id для элемента?

Как программно создавать id для элемента?

У меня есть цикл, который выводит слайды (библиотека owl-carousel2) с информацией по врачамИ для каждого слайда (класс doctors_slider__item) мне надо создать...

94
Добавление постов кастомного типа с помощью cron и ACF

Добавление постов кастомного типа с помощью cron и ACF

У меня есть задача в cron, которая парсит данные с одного сайта и переводит их в jsonПарсер работает исправно

79
Работа с API используя XML

Работа с API используя XML

Всем добрый день!

104
Нахождение номера недели по дате java

Нахождение номера недели по дате java

Есть график на две недели , то есть с 1 сентября у нас начинается первая неделя , потом следующая вторая, а потом следующая опять перваяПодскажите...

81