-1

我正在实施 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);
    }
}
?>

跳过“标签”键后,给定的代码应打印字符串(4)“零”。但它不打印任何东西。如果我将内部代码替换为:

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

然后它打印: string(4) "zero"

谁能解释一下?

4

2 回答 2

3

始终使用严格比较:

$key !== 'label'

使用您的原始代码,$key != 'label'0_ 您现在正在比较,这当然是错误的。'label''label'label00 != 0

相比:

0 == 'label'; // true
0 === 'label'; // false
于 2013-08-27T21:04:24.633 回答
1

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

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

于 2013-08-27T21:07:27.420 回答