这是一个PHP Bug吗?使用if运行foreach over mixed array

时间:2013-08-27 21:02:02

标签: php foreach

我正在实施piwik api,我在本地的piwik副本上发现了意外的行为。 (最新的piwik版本不再包含这段代码了。)

这是错误:

<?php
$arrtest = array('label' => array(1,2,3), 0 => 'zero');
foreach($arrtest as $key => $value) {
    if($key != 'label') {    
        var_dump($value);
    }
}
?>

给定代码在跳过'label'键后应该打印字符串(4)'零'。但它没有打印任何东西。如果我用以下内容替换内部代码:

if($key === 'label') continue;
var_dump($value);

然后打印:string(4)“zero”

任何人都能解释一下吗?

2 个答案:

答案 0 :(得分:3)

始终使用严格比较:

$key !== 'label'

使用原始代码$key != 'label',当0'label'进行比较时,'label'实际上是强制转换为int ,因为{ {1}}不以数字开头,它会自动强制转换为label,即int的默认值。您现在正在比较0,这当然是错误的。

比较

0 != 0

答案 1 :(得分:1)

这是PHP的“不寻常”类型强制规则生效。在您感兴趣的循环实例中,$key为0.因此比较为if (0 != 'label'),将整数与字符串进行比较。在这种情况下,它将使用其内置规则将字符串强制转换为整数。这会将label转换为0。因此,0 != 0是测试,但失败了。

正如您所注意到的,使用类型严格比较(不执行类型强制),以避免这种情况。