PHP:in_array()和array_search()的奇葩问题

近期做项目,发现使用array_search出现的问题——搜索出错,元素分明有在数组中,但给出的结果是FALSE!

操作逻辑如下

从数据库中取出符合条件的字符串的用户id合集

使用foreach遍历这些对象

将对象中的字符串使用explode函数变为数组

查找用户id是否位于这些数组中,如果有,则数量加一

用于遍历的对象data

array(6) {
  [0]=>
  array(1) {
    ["points_uid"]=>
    string(5) "4,2,6"
  }
  [1]=>
  array(1) {
    ["points_uid"]=>
    string(9) "2,4,6,7,5"
  }
  [2]=>
  array(1) {
    ["points_uid"]=>
    string(10) "8,12,17,19"
  }
  [3]=>
  array(1) {
    ["points_uid"]=>
    string(1) "2"
  }
  [4]=>
  array(1) {
    ["points_uid"]=>
    string(3) "2,5"
  }
  [5]=>
  array(1) {
    ["points_uid"]=>
    string(1) "2"
  }
}

逻辑代码

$sql="SELECT uid From table where time between time1 and time2";
$data=$obj->fetchAll($sql);//从数据库拿数据
$hire_counts=0;
foreach ($data as $key=>$arr){
       echo $key."--";
       echo $arr["points_uid"]."<br>";
       if(array_search(2,explode(",",$arr["points_uid"]))){
           echo "OK<br>";
           $hire_counts++;
       }else{
           echo "NO<br>";
       }
   }

输出的结果

0--4,2,6
OK
1--2,4,6,7,5
NO
2--8,12,17,19
NO
3--2
NO
4--2,5
NO
5--2
NO

这是一个很奇怪的事情,2在后面的元素中多次出现,但均报出NO。

修改代码

将array_search()改为in-array()后问题解决

$sql="SELECT uid From table where time between time1 and time2";
$data=$obj->fetchAll($sql);//从数据库拿数据
$hire_counts=0;
foreach ($data as $key=>$arr){
       echo $key."--";
       echo $arr["points_uid"]."<br>";
       if(in_array(2,explode(",",$arr["points_uid"]))){
           echo "OK<br>";
           $hire_counts++;
       }else{
           echo "NO<br>";
       }
   }

输出结果

0--4,2,6
OK
1--2,4,6,7,5
OK
2--8,12,17,19
NO
3--2
OK
4--2,5
OK
5--2
OK

问题解决

为什么array_search()给出了奇怪的结果呢?

其实它没有错,错在if语句——if判断中,如果值为0,会被判定为FALSE,而此前的输出中,结果是NO的部分,2都出现在第一个,array_search()返回值是0,因此被if语句判定为FLASE!