Например, у меня многомерная матрица (это может быть много уровней):
$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);
Но он ничего не находит. Есть ли ошибка в цикле?
Я играл с вашим кодом, чтобы заставить его работать:
function findKey($array, $keySearch) { foreach ($array as $key => $item) { if ($key == $keySearch) { echo 'yes, it exists'; return true; } else { if (is_array($item) && findKey($item, $keySearch)) { return true; } } } return false; }
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
function findKey($array, $keySearch) { // check if it's 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's 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>'; }
Наверняка некоторые ошибки, это примерно то, что вам нужно? (Неиспользованный код):
$ 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; } } } }
возвращает false, если не существует, возвращает первый экземпляр if;
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; }
Вы можете написать это в одной строке кода! да!
str_contains(json_encode($array), 'key')
Вот однострочное решение:
echo strpos(json_encode($array), $key) > 0 ? "found" : "not found";
Это преобразует массив в строку, содержащую эквивалент JSON, затем она использует эту строку в качестве аргумента сена для функции strpos (), и в качестве аргумента иглы используется $ key (ключ $ – значение, которое нужно найти в строке JSON).
Может быть полезно сделать это, чтобы увидеть преобразованную строку: echo json_encode($array);
Обязательно приложите аргумент иглы в одинарные кавычки, а затем двойные кавычки, потому что часть имени пары имя / значение в строке JSON будет отображаться с двойными кавычками вокруг него. Например, если вы ищете 22 в массиве ниже, то $key = '"22"'
даст правильный результат, не найденный в этом массиве:
$array = Array ( 21 => Array ( ), 24 => Array ( 522 => Array ( ), 25 => Array ( 26 => Array ( ) ) ) );
Однако, если одинарные кавычки оставлены, как в $key = "22"
то для массива выше будет найден неправильный результат поиска.
EDIT: Дальнейшее улучшение будет заключаться в поиске $key = '"22":';
просто добавьте значение "22"
в массив. то есть. 27 => "22"
Кроме того, этот подход не является доказательством пули. Неправильное обнаружение может возникнуть, если в каком-либо из значений массива содержится строка '"22":'