首页 > 解决方案 > array_search 没有找到第一个数组元素

问题描述

我在一个简单的 PHP 代码片段上遇到了这种奇怪的行为。我有一个foreach循环需要遍历多个用户并为每个用户增加一个变量,除非用户的 id 是给定数组的成员。

现在,foreach 正在遍历 ID 为 1 到 1000 的用户,它工作正常,除了用户 ID 74 应该被跳过但不是。正确跳过 ID 为 75-81 的用户

编码:

$exceptions = array(74,75,76,77,78,79,80,81);
foreach ($users as $u)
{
  if (array_search($u->id, $exceptions) == false)
  {
     // not found on the array, so no skipping
     $i++;
  }
}

以上是对代码的过度简化,但它有助于重现问题。该数组是从单独的数据库查询动态形成的,并且格式正确。当print_r为数组做 a 时按预期出现:

Array
(
    [0] => 74
    [1] => 75
    [2] => 76
    [3] => 77
    [4] => 78
    [5] => 79
    [6] => 80
    [7] => 81
)

问题是没有抛出错误,循环正确地遍历了 1000 个用户,但只排除了用户 75 到 81。我注意到只有第一个数组元素被“忽略”,所以我通过定义一个不存在的用户 ID 来解决这个问题(0) 作为第一个数组元素,这很有帮助。但由于这是一个丑陋的解决方案,我整个下午都在试图解决这个问题。正如您在上面可能注意到的,我没有使用严格的比较,所以这不应该是问题。

在调试期间,我更改了代码以编写一些日志。每次检查用户 ID 并且该用户 ID 不存在于$exclusions数组中时,都会添加一个日志条目。不出所料,记录了“在排除项中未找到 74”。我做了一些进一步的跟踪,只是发现在第一个数组元素上,IF 子句评估为假。

在这一点上,这只是学术上的好奇心,因为丑陋的解决方法有效,但有人知道为什么会发生这种情况吗?

标签: phparraysforeach

解决方案


推荐阅读