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

Как я могу искать ключ массива из многомерного массива и возвращать найденное значение ключа с ключом родительского массива, если он существует. Например, у меня есть пользовательский массив:

$array = [
    'type' => 'vacancy',
    'needs' => ['root' => 'active'],
    'market' => 'shopping',
    'red' => 'color', 
    'education' => 'learning',
    'fruits' => [
        'red' => 'apple',
        'cool' => 'cherry'
    ]
];

Например, мне нужен ключ поиска red из текущего массива. Как видите, в этом массиве есть 2 элемента с ключом red. Если у массива есть похожие ключи, то функция возвращает пример массива в качестве ответа:

[
    0 => ['red' => 'color'],
    1 => ['red' => 'apple']
]

Если ключ поиска (пример type) находится внутри массива только один раз, ответ будет таким:

['type' => 'vacancy']

Я устал:

function searchKey($key, $array) {
    foreach ($array as $k => $v) {
        if ($key === $k) {
            return [$k => $v];
        } elseif (is_array($v)) {
            return searchKey($key, $v);
        } elseif (is_array($k)) {
            return searchKey($key, $k);
        }
    }
    return false;
}

Когда я ищу ключ root из массива, результат правильный, но когда я ищу ключ red, возвращаю false. Как можно решить мою функцию или какие-либо методы производительности для поиска ключа и получения результата для моих нужд?

глубину массива можно увеличить? например, дочерний массив может иметь в нем еще один дочерний массив?

Anant Kumar Singh 31.05.2019 09:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать это:

function findByKey($findKey, $array, $result = []) {
    foreach ($array as $key => $value) {
        if ($key === $findKey) {
            $result[] = [$key => $value];
        }
        if (is_array($value)) {
            $result = findByKey($findKey, $value, $result);
        }
    }
    return $result;
}

Идея состоит в том, чтобы использовать рекурсивную функцию:

  1. вы перебираете свой массив
  2. для каждого key => value вы проверяете, является ли ключ тем, что вам нужно: если да, добавьте его в массив результатов, иначе идите дальше
  3. если значение является другим массивом, вы ищете внутри этого массива, если у вас есть ключ, который вы хотите

Теперь используйте его:

$array = [
    'type' => 'vacancy',
    'needs' => ['root' => 'active'],
    'market' => 'shopping',
    'red' => 'color', 
    'education' => 'learning',
    'fruits' => [
        'red' => 'apple',
        'cool' => 'cherry'
   ]
];

С ключом type :

$result = findByKey('type', $array);

var_dump($result);

Выход:

array(1) {
[0]=>
    array(1) {
    ["type"]=>
        string(7) "vacancy"
    }
}

С ключом red :

$result = findByKey('red', $array);

var_dump($result);

Выход:

array(2) {
    [0]=>
    array(1) {
        ["red"]=>
        string(5) "color"
    }
    [1]=>
    array(1) {
        ["red"]=>
        string(5) "apple"
    }
}

Вот ссылка для проверки: связь

Я рад, что это помогло :)

Mickaël Leger 31.05.2019 09:19

Я тоже тестировал, и логика соблюдается, но только если $result есть только один элемент, тогда должен возвращаться массив по умолчанию (без многомерного) @Mickael Leger

Andreas Hunter 31.05.2019 10:00

Другие вопросы по теме