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年 12月 15日 上午11:43

相关推荐

  • PHP:设计模式之单例模式及数据库案例

    设计模式的定义 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性... 简而言之,就是前...

    2022年 10月 23日
    100
  • 实战:最麻烦的群晖SHR+Btrfs阵列数据救援

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

    2022年 8月 18日
    289
  • CentOS 开放端口和防火墙配置

    CentOS 快速开放端口 CentOS升级到7之后,无法使用iptables控制Linuxs的端口,Centos 7使用firewalld代替了原来的iptables。此方案实测也适用于CentOS Stream 9。 查看防火墙状态 查询放行端口列表 开启端口(以...

    2022年 11月 7日
    178
  • PHP类的自动加载函数:spl_autload_register()

    一个PHP项目里通常有许多个类(class),如果在每个PHP页面的开头进行引入,非常麻烦,尤其是不同的PHP页面需要不同的类。 因此,PHP7之前,有__autoload()函数用于自动引用类,PHP7之后则改为了spl_autload_regi...

    2022年 10月 22日
    134
  • 基于JQuery的AJAX异步文件上传方法

    对于许多初学者而言,上传表单很容易,但上传文件就麻烦了。 这里给出一个简单的方法,供参考。 HTML部分 谨记:action可以留空,enctype要设为“multipart/form-data” Javascript部分 PHP部分 如果不出意外,你的...

    2022年 11月 8日
    140

发表回复

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