我正在实施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”
任何人都能解释一下吗?
答案 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
是测试,但失败了。
正如您所注意到的,使用类型严格比较(不执行类型强制),以避免这种情况。