这是一个PHP错误吗?使用if在混合数组上运行foreach

这是一个PHP错误吗?使用if在混合数组上运行foreach,php,foreach,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); } } ?> 然后

我在实现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)“零”


有人能解释这一点吗?

使用严格的比较,始终:

$key !== 'label'
使用原始代码
$key!='标签“
,当将
0
'label'
进行比较时,
'label'
实际上被强制为int,并且由于
label
不以数字开头,它会自动强制为int的默认值
0
。您现在正在比较
0!=0,这当然是错误的

比较:

0 == 'label'; // true
0 === 'label'; // false
这是有效的PHPs“异常”类型强制规则。在您感兴趣的循环实例中,
$key
为0。因此,如果(0!='label')
,则比较是
,将整数与字符串进行比较。在本例中,它将使用其内置规则将字符串强制为整数。这将
标签
转换为
0
。所以,
0!=0是失败的测试


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

php错误或您的代码错误,更有可能发生什么?数以千万计的php代码行正在进行中,每天为互联网上绝大部分的请求提供服务,其中大部分比您的示例更复杂。你的琐碎循环发现PHP中这样一个基本错误的几率有多大?嗯,也许不总是这样,但你必须真正确定在使用它时你想要松散相等。@Izkata我没有遇到过不使用严格比较运算符有意义的情况;使用松散的比较运算符只是要求在代码中引入一些细微的错误。php编码已经10多年了,我从来没有遇到过这种错误!很好的解释。谢谢@mc10一个示例:必须比较来自不同来源的数字的通用函数。严格相等表示,例如,
5
'5'
是不同的。我很少使用它,因为它使代码更简单,更容易理解。@Izkata数字应该存储为数字,而不管其来源如何。如果它们不是,当您检索它们时,您应该在与它们进行比较之前强迫它们进入
int
s或
double
s,以减少您必须担心不同类型的区域,并最大限度地减少bug。
0 == 'label'; // true
0 === 'label'; // false