PHP: проверьте, существуют ли значение и ключ в многомерном массиве

Просто интересно, можете ли вы дать мне руку с этим:

У меня многомерный массив …

$my_array = array( 0 => array( "name" => "john", "id" => 4 ), 1 => array( "name" => "mark", "id" => 152 ), 2 => array( "name" => "Eduard", "id" => 152 ) ); 

Любая идея о том, какой был бы самый быстрый и эффективный способ проверить, содержит ли массив $ my_array какое-либо значение с ключом «id» и его значением 152. Мне не нужно эхо или использовать какие-либо из значений. Мне просто нужно проверить (вернуть true), если в массиве есть записи с идентификатором «ключ» и значением «152».

Ничто не будет быстрее, чем простой цикл. Вы можете комбинировать и сопоставлять некоторые функции массива, но они будут реализованы как цикл.

 function whatever($array, $key, $val) { foreach ($array as $item) if (isset($item[$key]) && $item[$key] == $val) return true; return false; } 

Вот обновленная версия ответа Дэна Гроссмана, которая будет обслуживать многомерные массивы (что я был после):

 function find_key_value($array, $key, $val) { foreach ($array as $item) { if (is_array($item) && find_key_value($item, $key, $val)) return true; if (isset($item[$key]) && $item[$key] == $val) return true; } return false; } 

Если вам нужно много искать «id», и это должно быть очень быстро, вы должны использовать второй массив, содержащий все «идентификаторы» в качестве ключей:

 $lookup_array=array(); foreach($my_array as $arr){ $lookup_array[$arr['id']]=1; } 

Теперь вы можете быстро проверить существующий идентификатор, например:

 echo (isset($lookup_array[152]))?'yes':'no'; 

** PHP> = 5.5

просто вы можете использовать это

 $key = array_search(40489, array_column($userdb, 'uid')); 

Предположим, что этот многомерный массив:

 $userdb=Array ( (0) => Array ( (uid) => '100', (name) => 'Sandra Shush', (url) => 'urlof100' ), (1) => Array ( (uid) => '5465', (name) => 'Stefanie Mcmohn', (pic_square) => 'urlof100' ), (2) => Array ( (uid) => '40489', (name) => 'Michael', (pic_square) => 'urlof40489' ) ); $key = array_search(40489, array_column($userdb, 'uid')); 

Как и в вашем вопросе, который на самом деле является простым двухмерным массивом, не лучше ли это? Взгляни-

Скажем, ваше двумерное имя массива $ my_array и значение для поиска – $ id

 function idExists($needle='', $haystack=array()){ //now go through each internal array foreach ($haystack as $item) { if ($item['id']===$needle) { return true; } } return false; } 

и называть его:

 idExists($id, $my_array); 

Как вы можете видеть, на самом деле проверяет только, есть ли какой-либо внутренний индекс с ключом «id» только с вашим значением $. Некоторые другие ответы здесь также могут быть истинными, если имя_имя 'name' также имеет значение $ value

 return 0 < count( array_filter( $my_array, function ($a) { return array_key_exists('id', $a) && $a['id'] == 152; } ) ); 

Примечание: вызов array_key_exists является обязательным. Он просто поддается коварной выносливости.

Попробуйте этот ниже код. Он должен отлично работать для любого поиска многомерных массивов.

Здесь вы можете увидеть LIVE DEMO EXAMPLE

 function multi_array_search($search_for, $search_in) { foreach ($search_in as $element) { if ( ($element === $search_for) ){ return true; }elseif(is_array($element)){ $result = multi_array_search($search_for, $element); if($result == true) return true; } } return false; } 

Хорошим решением может быть приложение, представленное @Elias Van Ootegan в комментарии:

 $ids = array_column($array, 'id', 'id'); echo isset($ids[40489])?"Exist":"Not Exist"; 

Я попробовал и работал на меня, спасибо, друг.

отредактированный

Примечание. Он будет работать в PHP 5.5+

Используйте array_map ()

$ options – массив, в котором вы ищете.

 $arr = array_map(function($ar) { if(array_key_exists('name_of_the_key_you_search_for',$ar)){ return true; }else{ return false; } },$options ); var_dump($arr); //just for test, remove in the code 

Я написал следующую функцию, чтобы определить, содержит ли многомерный массив частично определенное значение.

 function findKeyValue ($array, $needle, $value, $found = false){ foreach ($array as $key => $item){ // Navigate through the array completely. if (is_array($item)){ $found = $this->findKeyValue($item, $needle, $value, $found); } // If the item is a node, verify if the value of the node contains // the given search parameter. EG: 'value' <=> 'This contains the value' if ( ! empty($key) && $key == $needle && strpos($item, $value) !== false){ return true; } } return $found; } 

Вызвать функцию следующим образом:

 $this->findKeyValue($array, $key, $value);