Как я могу искать ключ массива из многомерного массива и возвращать найденное значение ключа с ключом родительского массива, если он существует. Например, у меня есть пользовательский массив:
$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
. Как можно решить мою функцию или какие-либо методы производительности для поиска ключа и получения результата для моих нужд?
Вы можете попробовать это:
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;
}
Идея состоит в том, чтобы использовать рекурсивную функцию:
key => value
вы проверяете, является ли ключ тем, что вам нужно: если да, добавьте его в массив результатов, иначе идите дальшеТеперь используйте его:
$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"
}
}
Вот ссылка для проверки: связь
Я рад, что это помогло :)
Я тоже тестировал, и логика соблюдается, но только если $result
есть только один элемент, тогда должен возвращаться массив по умолчанию (без многомерного) @Mickael Leger
глубину массива можно увеличить? например, дочерний массив может иметь в нем еще один дочерний массив?