Проверьте, существует ли определенный массив ключей в многомерном массиве – 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); 

Но он ничего не находит. Есть ли ошибка в цикле?

Solutions Collecting From Web of "Проверьте, существует ли определенный массив ключей в многомерном массиве – PHP"

Я играл с вашим кодом, чтобы заставить его работать:

 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":'