我一直在一个简单的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
时按预期出现:
Array
(
[0] => 74
[1] => 75
[2] => 76
[3] => 77
[4] => 78
[5] => 79
[6] => 80
[7] => 81
)
问题是没有引发错误,循环正确地循环了1000个用户,但只排除了75至81个用户。我注意到只有第一个数组元素被“忽略”,因此我通过定义一个非现有的用户ID(0)作为第一个数组元素,这很有帮助。但是由于这是一个丑陋的解决方案,所以我一直在努力解决整个下午的问题。正如您可能在上面指出的那样,我没有使用严格的比较,所以这不应该成为问题。
在调试期间,我更改了代码以编写一些日志。每次检查用户ID并在$exclusions
数组中不存在该用户ID时,都会添加一个日志条目。毫不奇怪,记录了“在排除中未找到74”。
我做了一些进一步的跟踪,只是发现在第一个数组元素上,IF子句的值为false。
在这一点上,这只是学术上的好奇心,因为这种丑陋的解决方法有效,但是有人知道为什么会发生这种情况吗?