Как найти значение многомерного массива по ключу - PullRequest
1 голос
/ 31 мая 2019

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

$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.Как может быть решена моя функция или есть какие-то методы повышения эффективности поиска ключа и получения результата для моих нужд?

1 Ответ

2 голосов
/ 31 мая 2019

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

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"
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...