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".
Ответы
Ответ 1
Ничто не будет быстрее, чем простой цикл. Вы можете смешивать и сопоставлять некоторые функции массива, но они будут реализованы как цикл.
function whatever($array, $key, $val) {
foreach ($array as $item)
if (isset($item[$key]) && $item[$key] == $val)
return true;
return false;
}
Ответ 2
Вот обновленная версия ответа Дэна Гроссмана, которая будет обслуживать многомерные массивы (что я был после):
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;
}
Ответ 3
** PHP >= 5.5
просто u может использовать этот
$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'));
Ответ 4
Если вам нужно сделать много поисков "id", и это должно быть очень быстро, вы должны использовать второй массив, содержащий все "идентификаторы" в качестве ключей:
$lookup_array=array();
foreach($my_array as $arr){
$lookup_array[$arr['id']]=1;
}
Теперь вы можете быстро проверить существующий идентификатор, например:
echo (isset($lookup_array[152]))?'yes':'no';
Ответ 5
Как и в вашем вопросе, который на самом деле является простым 2-мерным массивом, было бы лучше? Посмотрите -
Скажем, ваше двумерное имя массива $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" только с вашим значением $. Некоторые другие ответы здесь также могут быть истинными, если key_name 'name' также имеет значение $
Ответ 6
return 0 < count(
array_filter(
$my_array,
function ($a) {
return array_key_exists('id', $a) && $a['id'] == 152;
}
)
);
Примечание: вызов array_key_exists
не является обязательным. Он просто поддается кодированию выносливости.
Ответ 7
Попробуйте использовать этот ниже код. Он должен отлично работать для любого поиска многомерных массивов.
Здесь вы можете увидеть 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;
}
Ответ 8
Хорошим решением может быть сообщение, предоставленное @Elias Van Ootegan
в комментарии:
$ids = array_column($array, 'id', 'id');
echo isset($ids[40489])?"Exist":"Not Exist";
Я попробовал и работал у меня, спасибо приятелю.
Edited
Примечание. Он будет работать в PHP 5.5 +
Ответ 9
Я написал следующую функцию, чтобы определить, содержит ли многомерный массив некоторое определенное значение.
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. E.G.: 'value' <=> 'This contains the value'
if ( ! empty($key) && $key == $needle && strpos($item, $value) !== false){
return true;
}
}
return $found;
}
Вызвать функцию следующим образом:
$this->findKeyValue($array, $key, $value);
Ответ 10
Используйте 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
Ответ 11
function checkMultiArrayValue($array) {
global $test;
foreach ($array as $key => $item) {
if(!empty($item) && is_array($item)) {
checkMultiArrayValue($item);
}else {
if($item)
$test[$key] = $item;
}
}
return $test;
}
$multiArray = array(
0 => array(
"country" => "",
"price" => 4,
"discount-price" => 0,
),);
$test = checkMultiArrayValue($multiArray);
echo "<pre>"
print_r($test);
Вернет массив, у которого есть индекс и значение
Ответ 12
Самый простой способ заключается в следующем:
$my_array = array(
0 => array(
"name" => "john",
"id" => 4
),
1 => array(
"name" => "mark",
"id" => 152
),
2 => array(
"name" => "Eduard",
"id" => 152
)
);
if (array_search(152, array_column($my_array, 'id')) !== FALSE)
echo 'FOUND!';
else
echo 'NOT FOUND!';