如何在关联数组中使用PHP的in_array函数?

22

有没有可以用于由mysql函数“mysql_fetch_assoc”获取的关联数组的类似于in_array的PHP函数?

例如,如果我有一个看起来像这样的$array:

array(0=>(array(ID=>1, name=>"Smith"), 1=>(array(ID=>2, name=>"John"))

我可以像这样做吗:in_array(key,value,array)?

或者在我的情况下,如果我要查找“1”的ID值,in_array("ID",1,$array)

这是我的解决方案,如果您认为这是正确的方法,请发表评论:

function in_assoc_array($key,$value,$array)
{
    if (empty($array))
        return false;
    else
    {
        foreach($array as $a)
        {
            if ($a[$key] == $value)
                return true;
        }
        return false;
    }
}

1
我觉得你想要将键/值对与给定的值进行比较。是吗? - Rahil Wazir
7个回答

46
在您的情况下,我想知道是否简单地使用isset()更有意义,即:
isset($a[$key])

2
当我们知道键和数组是以这种方式设计的时,我们使用isset。有时我们需要使用in_array进行搜索。 - rajangupta
您的轻量、简洁和优美的解决方案起作用了,这就是应该的。谢谢@Phil LaNAsa。 - Samuel Ramzan

19

这里是一个您可以使用的一行代码。

$isInArray = in_array(1, array_column($names, 'ID'));
$isInArray = 一个布尔值(true 或 false),定义了给定的值是否在所查询的数组列中被找到。 1 = 要在数组中搜索的值。 $names = 所查询的数组。 'ID' = 在数组中搜索值为1的列。

1
这个完美地工作了,救了我的一天,对于使用 Laravel 项目填充的两个 foreach 循环和复选框也非常完美。 - Imran_Developer

17

试试这个...... 您可以将此函数用于关联数组的任何深度。只需限制此函数的是,键值不会在数组中重复出现。

<?php 
function is_in_array($array, $key, $key_value){
      $within_array = 'no';
      foreach( $array as $k=>$v ){
        if( is_array($v) ){
            $within_array = is_in_array($v, $key, $key_value);
            if( $within_array == 'yes' ){
                break;
            }
        } else {
                if( $v == $key_value && $k == $key ){
                        $within_array = 'yes';
                        break;
                }
        }
      }
      return $within_array;
}
$test = array(
                0=> array('ID'=>1, 'name'=>"Smith"), 
                1=> array('ID'=>2, 'name'=>"John")
        );
print_r(is_in_array($test, 'name', 'Smith'));
?>

我不明白为什么你要写新代码,因为已经有内置函数可以实现。你可以在下面看到它。另外,$k变量浪费了内存空间,因为它只需要检查值。 - PumpkinSeed
@AndrewJarvis 虽然已经有一段时间了,但你为什么这么说? - Jacob Cohen
@JacobCohen 在顶层数组上使用foreach循环和一个简单的if (isset($array["ID"]) && $array["ID"] === 1) {}就可以用更少的代码完成任务。 - Jarvl
很好的答案...对我有效。 - deemi-D-nadeem

10

你不能直接在嵌套数组上执行此操作。你需要将其嵌套下去,然后再执行。

<?php
$arr=array(0=>array('ID'=>1, 'name'=>"Smith"), 1=>array('ID'=>2, 'name'=>"John"));

foreach($arr as $arr1)
{
    if(in_array(1,$arr1))
    {
       echo "Yes found.. and the correspoding key is ".key($arr1)." and the employee is ".$arr1['name'];
    }
}

输出:

Yes found.. and the correspoding key is ID and the employee is Smith

那我就只能自己写一个函数了,是吧? - Jacob Cohen
1
不,只需使用foreach循环,然后在其中完成操作即可。 - Shankar Narayana Damodaran
我编辑了我的帖子,请查看代码并告诉我您是否认为它是正确的,或者是否有更好的方法。 - Jacob Cohen
@JacobCohen,请看编辑后的答案,你是不是在寻找类似的东西? - Shankar Narayana Damodaran
1
几乎了!我想要为我选择的特定键执行此操作。但我自己设法写出来了,谢谢你的启示。 - Jacob Cohen

8

首先,您需要知道在 in_array 函数中将要使用的关联数组的哪个部分作为干草堆。然后,您可以使用 in_array 而不需要额外的代码。

以下是一个带有值的示例:

<?php
$assoc = array(1 => "apple", 2 => "banana", 3 => "lemon", 4 => "pear");
$haystack = array_values($assoc);
echo "<p>" . print_r($assoc, true) . "</p>";

$needle = 'banana';
$find = (in_array($needle, $haystack)) ? 'TRUE' : 'FALSE';
echo "<p>$needle : $find</p>";

$needle = 'cherry';
$find = (in_array($needle, $haystack)) ? 'TRUE' : 'FALSE';
echo "<p>$needle : $find</p>";
?>

结果如下:

Array ( [1] => apple [2] => banana [3] => lemon [4] => pear )

banana : TRUE

cherry : FALSE

4

语法

 in_array(mixed $needle, array $haystack, bool $strict = false): bool

Needle可以是混合类型,因此它可以是任何类型,如果它是数字或关联数组也没有问题。

in_array('foo',array_unique(array_keys($array)));


0

使用类和方法的示例公式:

class VerifyInArray
{
 public function getMyCollection($field, $collection)
 {
     $list = array();
     if (count($collection)) {
        foreach ($collection as $k => $val) {
            $list[] = $val[$field];
        }
     }
     return $list;
 }

public function inMyArray($collection, $field, $findValue)
{
    if (isset($collection[0])) {
        if (array_key_exists($field, $collection[0]) == false) {
           return 'no'; 
        }
    }

    if (in_array($findValue, $this->getMyCollection($field, $collection))) {
        return 'ok';
    }
    return 'no';
}

public function displayInArray($collection, $attr, $value)
{
   return 'search result: '. $this->inMyArray($collection, $attr, $value);
}

}
$src = new VerifyInArray();

 $collection = array(
         array(
               'ID' => 1, 
               'name' => 'Smith'
         ), 
         array(
               'ID' => 2, 
               'name' => 'John'
         )
    );
echo $src->displayInArray($collection, 'ID', 2). "\n<br>" .
     $src->displayInArray($collection, 'ID', 0);

ideone中的模型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接