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".
19 ответов
Ничто не будет быстрее, чем простая петля. Вы можете смешивать и сопоставлять некоторые функции массива, чтобы сделать это, но они также будут реализованы как цикл.
function whatever($array, $key, $val) {
foreach ($array as $item)
if (isset($item[$key]) && $item[$key] == $val)
return true;
return false;
}
Самый простой способ заключается в следующем:
$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!';
** 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'));
Вот обновленная версия ответа Дэна Гроссмана, которая будет обслуживать многомерные массивы (то, что я был после):
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';
Хорошее решение может быть предоставлено @Elias Van Ootegan
в комментарии это:
$ids = array_column($array, 'id', 'id');
echo isset($ids[40489])?"Exist":"Not Exist";
Я попробовал это и работал на меня, спасибо, приятель.
отредактированный
Примечание: это будет работать в PHP 5.5+
return 0 < count(
array_filter(
$my_array,
function ($a) {
return array_key_exists('id', $a) && $a['id'] == 152;
}
)
);
Замечания: array_key_exists
Звонить не обязательно. Это просто поддается устойчивости кода.
Как и в вашем вопросе, который на самом деле является простым 2-D массивом, не лучше ли? Посмотри-
Допустим, ваше двумерное имя массива $ 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' также имеет значение $
Я наткнулся на эту публикацию, пытаясь сделать то же самое, и придумал собственное решение, которое я хотел предложить будущим посетителям этой страницы (и посмотреть, не возникнет ли такой способ каких-либо проблем, которых я не предвидел).
Если вы хотите получить простой true
или false
output и хотите сделать это с помощью одной строки кода без функции или цикла, вы можете сериализовать массив, а затем использовать stripos
для поиска значения:
stripos(serialize($my_array),$needle)
Мне кажется, это работает.
Попробуйте с этим кодом ниже. Он должен работать нормально для любого вида поиска в многомерном массиве.
Здесь вы можете увидеть LIVE DEMO ПРИМЕР
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;
}
array_column
возвращает значения одного столбца массива, и мы можем искать конкретное значение для них черезin_array
if (in_array(152, array_column($my_array, 'id'))) {
echo 'FOUND!';
} else {
echo 'NOT FOUND!';
}
Я не знаю, лучше это или хуже для производительности, но вот альтернатива:
$keys = array_map(function($element){return $element['id'];}, $my_array);
$flipped_keys = array_flip($keys);
if(isset($flipped_keys[40489]))
{
// true
}
Используйте 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 existsKeyValue($myArray, $key, $value) {
$queue = [$myArray]; //creating a queue of a single element, which is our outermost array
//when we reach the count of the queue we looped all inner loops as well and failed to find the item
for ($index = 0; $index < count($queue); $index++) {
//Looping the current array, finding the key and the value
foreach ($queue[$index] as $k => &$v) {
//If they match the search, then we can return true
if (($key === $k) && ($value === $v)) {
return true;
}
//We need to make sure we did not already loop our current array to avoid infinite cycles
if (is_array($v)) $queue[]=$v;
}
}
return false;
}
$my_array = array(
0 => array(
"name" => "john",
"id" => 4
),
1 => array(
"name" => "mark",
"id" => 152
),
2 => array(
"name" => "Eduard",
"id" => 152
)
);
echo var_dump(existsKeyValue($my_array, 'id', 152));
Просто используйтеarray_column
как в примере ниже:
$my_array = [
[
"name" => "john",
"id" => 4
],
[
"name" => "mark",
"id" => 152
],
[
"name" => "Eduard",
"id" => 152
]
];
var_dump(in_array(152, array_column($my_array, 'id'))); // true
Вы можете использовать это только с двумя параметрами
function whatever($array, $val) {
foreach ($array as $item)
if (isset($item) && in_array($val,$item))
return 1;
return 0;
}
отличается между isset и array_key_exits В чем разница между isset () и array_key_exists ()?
различны между == vs === Чем отличаются операторы сравнения PHP равенства (== двойное равенство) и идентичности (=== тройное равенство)?
function specificValue(array $array,$key,$val) {
foreach ($array as $item)
if (array_key_exits($item[$key]) && $item[$key] === $val)
return true;
return false;
}
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);
Вернет массив, у которого есть индекс и значение
Я написал следующую функцию, чтобы определить, содержит ли многомерный массив определенное значение.
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);