Поиск ключа в многомерном массиве PHP

222
30 марта 2018, 13:53

Есть массив, многоуровневый (может быть 3 уровня, может 7) Важно найти на каком-бы то не было уровне элемент с ключом "audiofile" и передать его содержимое в другой массив через array_push, например Причем если элементов с таким ключом несколько, то в финальный массив должны попасть все Элементы могут находиться на разных уровнях, если их несколько

Answer 1

Функция

/**
 * @param string $searchKey Ключ который ищим
 * @param array $arr Массив в котором ищем
 * @param array $result Массив в который будет складываться результат (передается по ссылке)
 */
function search_key($searchKey, array $arr, array &$result)
{
    // Если в массиве есть элемент с ключем $searchKey, то ложим в результат
    if (isset($arr[$searchKey])) {
        $result[] = $arr[$searchKey];
    }
    // Обходим все элементы массива в цикле
    foreach ($arr as $key => $param) {
        // Если эллемент массива есть массив, то вызываем рекурсивно эту функцию
        if (is_array($param)) {
            search_key($searchKey, $param, $result);
        }
    }

Пример использования

// Результат
$result = [];
// Данные для теста
$arr = [
    'a' => 10,
    'b' => 20,
    'c' => [
        'x' => 10,
        'y' => 20,
        'z' => [
            'audiofile' => 'file://file1.mp3',
            'f' => null,
            'g' => [
                'audiofile' => 'file://file2.mp3'
            ],
        ]
    ],
];
search_key('audiofile', $arr, $result);
var_dump($result);
Answer 2

Как вариант можно воспользоваться итератором:

<?php
$candidate = [
    'a' => 10,
    'b' => 20,
    'c' => [
        'x' => 10,
        'y' => 20,
        'z' => [
            'audiofile' => 'file://file1.mp3',
            'f'         => null,
            'g'         => [
                'audiofile' => 'file://file2.mp3'
            ],
        ]
    ],
];
$result = [];
// Iteration on leafs AND nodes
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($candidate), RecursiveIteratorIterator::LEAVES_ONLY) as $key => $value) {
    if ('audiofile' === $key) {
        $result[] = $value;
    }
}
var_dump($result);
READ ALSO
Не работает удаленный доступ. MySQL server has gone away, code 2006

Не работает удаленный доступ. MySQL server has gone away, code 2006

Сайт на LaravelЕсть удаленное подключение в mysql бд на windows, которое исправно работает

211
Что писать в action формы

Что писать в action формы

Здравствуйте! На сайте есть форма фильтра:

193