Проверьте, существует ли определенный массив ключей в многомерном массиве - PHP
Я имею многомерную матрицу, например. (это может быть много уровней):
$array = Array (
[21] => Array ( )
[24] => Array (
[22] => Array ( )
[25] => Array (
[26] => Array ( )
)
)
)
Я пытаюсь пропустить его, чтобы увидеть, существует ли определенный ключ:
$keySearch=22; // key seraching for
function findKey($array, $keySearch) {
foreach ($array as $item){
if (isset($item[$keySearch]) && false === findKey($item[$keySearch], $item)){
echo 'yes, it exists';
}
}
}
findKey($array, $keySearch);
Но ничего не находит. Есть ли ошибка в цикле?
Ответы
Ответ 1
Я играл с вашим кодом, чтобы заставить его работать:
function findKey($array, $keySearch)
{
foreach ($array as $key => $item) {
if ($key == $keySearch) {
echo 'yes, it exists';
return true;
} elseif (is_array($item) && findKey($item, $keySearch)) {
return true;
}
}
return false;
}
Ответ 2
array_key_exists()
полезно.
Тогда что-то вроде этого:
function multiKeyExists(array $arr, $key) {
// is in base array?
if (array_key_exists($key, $arr)) {
return true;
}
// check arrays contained in this array
foreach ($arr as $element) {
if (is_array($element)) {
if (multiKeyExists($element, $key)) {
return true;
}
}
}
return false;
}
Рабочий пример: http://codepad.org/GU0qG5su
Ответ 3
function findKey($array, $keySearch)
{
// check if it even an array
if (!is_array($array)) return false;
// key exists
if (array_key_exists($keySearch, $array)) return true;
// key isn't in this array, go deeper
foreach($array as $key => $val)
{
// return true if it found
if (findKey($val, $keySearch)) return true;
}
return false;
}
// test
$array = Array (
21 => Array ( 24 => 'ok' ),
24 => Array (
22 => Array ( 29 => 'ok' ),
25 => Array (
26 => Array ( 32 => 'ok' )
)
)
);
$findKeys = Array(21, 22, 23, 24, 25, 26, 27, 28, 29, 30);
foreach ($findKeys as $key)
{
echo (findKey($array, $key)) ? 'found ' : 'not found ';
echo $key.'<br>';
}
Ответ 4
Вы можете написать его в одной строке кода!
да!
str_contains(json_encode($array), 'key')
Ответ 5
Наверняка некоторые ошибки, это примерно то, что вам нужно? (Неиспользованный код):
$keySearch = 22;//key seraching для
function findKey($array, $keySearch)
{ // check whether input is an array
if(is_array($array)
{
foreach ($array as $item){
if (isset($item[$keySearch]) || findKey($item, $keysearch) === true)
{
echo 'yes, it exists';
return true;
}
}
}
}
Ответ 6
возвращает false, если не существует, возвращает первый экземпляр, если:
function searchArray( array $array, $search )
{
while( $array ) {
if( isset( $array[ $search ] ) ) return $array[ $search ];
$segment = array_shift( $array );
if( is_array( $segment ) ) {
if( $return = searchArray( $segment, $search ) ) return $return;
}
}
}
return false;
}
Ответ 7
Вот однострочное решение:
echo strpos(json_encode($array), $key) > 0 ? "found" : "not found";
Это преобразует массив в строку, содержащую эквивалент JSON, затем использует эту строку в качестве аргумента haystack функции strpos(), и в качестве аргумента иглы используется $key ($ key - значение, которое нужно найти в JSON строка).
Это может быть полезно сделать, чтобы увидеть преобразованную строку: echo json_encode($array);
Обязательно приложите аргумент иглы в одинарные кавычки, а затем в двойные кавычки, потому что часть имени пары имя/значение в строке JSON будет отображаться с двойными кавычками вокруг нее. Например, если вы ищете 22 в массиве ниже, то $key = '"22"'
даст правильный результат не найден в этом массиве:
$array =
Array (
21 => Array ( ),
24 =>
Array (
522 => Array ( ),
25 =>
Array (
26 => Array ( )
)
)
);
Однако, если одинарные кавычки оставлены, как и в $key = "22"
, то для массива выше будет получен неправильный результат найденный.
РЕДАКТИРОВАТЬ: Дальнейшим усовершенствованием будет поиск $key = '"22":';
только для того, чтобы в массиве существовало значение "22"
. то есть. 27 => "22"
Кроме того, этот подход не является доказательством пули. Неверный найденный может возникнуть, если любое из значений массива содержит строку '"22":'