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!

原创文章,作者:STEVE,如若转载,请注明出处:https://shinecloud.com.cn

(0)
上一篇 2022年 11月 8日 下午5:30
下一篇 2022年 11月 7日 下午5:01

相关推荐

  • 实战:最麻烦的群晖SHR+Btrfs阵列数据救援

    开篇语 这篇文章与其说是教程,不如说是一次经验总结。 我并不是专业数据恢复人员,只是在互联网上搜索各类教程,然后尝试,最终获得了成功! 前前后后一共折腾了5天,有很多次都不想搞了,但我抱着一个信念:只要硬...

    2022年 8月 18日
    101
  • PHP:单例模式的多功能数据库工具类

    此数据库工具类根据传智播客2018年8月的PHP教程所设计。...

    2022年 10月 28日
    46
  • PHP类:成员、静态、常量的区别和选择

    PHP的类中,分为常量、静态、成员三类,初学者很容易搞混乱,笔者在学习之时也深感头疼,觉得不好理解。 分享一下学习的总结,如有错误之处敬请指正。 权限修饰符 权限修饰符用来声明变量的权限,共有三种。 public...

    2022年 10月 19日
    50
  • PHP连接数据库:使用类和函数两种方式

    PHP连接数据库是非常常用的功能,在初学时,一般使用函数来连接。 函数的方式非常简单,如果不需要报错信息的话,只有2行代码,加上报错信息,也只有6行而已。 我们尝试定义一个类来连接数据库,如下所示: 好家伙,...

    2022年 10月 20日
    55
  • PHP:数组变量的序列化和反序列化

    序列化和反序列化是PHP操作数据库、读写文件时常见的操作。 序列化,就是将PHP的变量转化为可保存的、可传输的字符串的过程; 反序列化,则是将(序列化的)字符串转化回变量。 比如,我们需要将某学生的个人信息写...

    2022年 10月 25日
    35

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注