【问题标题】:Foreach loop issues in phpphp中的foreach循环问题
【发布时间】:2011-08-26 13:18:48
【问题描述】:

这是我的一些代码:(p 只是回显加上换行符)

foreach ($vanSteps as $k => $reqInfo) 
{
    p($k);
    if ('van' == $k) { p('The key is the van, continue'); continue; }//continue if we reached the part of the array where van is key
    //do stuff
}

我得到了这个输出:

0
The key is the van, continue
1
2
3
van
The key is the van, continue

为什么当key为0时if语句返回true?这个 foreach 循环处理当 key == 0(以及任何其他 key,除非 key 是 'van')时应用的逻辑,这会弄乱逻辑,因为它在 key 为 0 时返回 true。

有什么帮助吗?

谢谢。

【问题讨论】:

  • 是的,我们可以在$vanSteps 上看到 print_r 吗?

标签: php loops foreach


【解决方案1】:

使用=== 进行比较。当 PHP 比较字符串和整数时,它首先将字符串转换为整数值,然后进行比较。

参见手册中的Comparison Operators

【讨论】:

  • ...and 'van' == 0, but 'van' !== 0
  • 谢谢,这成功了。我一定会在将来调试时寻找这个。 =]
  • 这是一个常见的错误,在各种 PHP 教程中经常被忽视。
  • 这当然不是一个普遍的错误,也许很常见。
【解决方案2】:

在 PHP 中,'van' == 0true。这是因为在使用==比较字符串和数字时,字符串被转换为数字(如下面第二个链接所述);这使得内部比较变为0 == 0,当然是true

根据您的需要,建议的替代方法是使用 === 进行严格的相等比较。

Comparison OperatorsString conversion to numbers

【讨论】:

    【解决方案3】:

    在 PHP 中,当你比较两种类型时,它必须将它们转换为相同的类型。在您的情况下,您将stringint 进行比较。 这在内部被转换为

    if((int)'van'==0).... 进而 if((int)'van'==1)....

    (int)'any possible string' 将是0:) 所以你要么必须手动将两个值转换为相同的类型,要么使用=== 作为比较运算符,而不是松散的= . 此规则的一个例外(如 cmets 中所指出的)是字符串以数字开头,或者可以以任何方式解释为数字(1、0002、-1 等)。在这种情况下,字符串将被解释为数字,而不考虑非数字字符串结尾的结尾

    查看http://php.net/manual/en/types.comparisons.php了解更多详情。

    【讨论】:

    • 应该是"(int)'任何不以数字开头的可能字符串'都将是0" ;)
    • @Felix - 字符串可以以非数字字符开头,但仍被解释为非零。
    • @salathe:你是说标志吗?我实际上只是想指出不是 every 字符串都被转换为零......
    • @Felix,是的。下次再说你的意思。 :)
    【解决方案4】:

    这很好用:

    $array = array(0=>"a",1=>"b","van"=>"booya!");
    
    function p($v){ echo "{$v}<br />"; }
    
    foreach ($array as $k => $reqInfo) 
    {
        p($k);
        if ('van' === $k) { p('The key is the van, continue'); continue; }//continue if we reached the part of the array where van is key
        //do stuff
    }
    

    输出:

    0
    1
    van
    The key is the van, continue
    

    注意===

    【讨论】:

      【解决方案5】:

      阅读Comparison with Various Types table 当其中一个操作数为数字时,另一个操作数也转换为数字。因为 'van' 是非数字字符串,所以它被转换为 0。你应该在这种情况下使用 === 运算符,它还会检查变量类型

      【讨论】:

        【解决方案6】:

        那是因为'van' == 0 (true)。

        相反,您应该使用'van' === 0 (false)。

        简而言之,使用 === 而不是 ==。

        【讨论】:

          【解决方案7】:

          它将'van' 解释为一个布尔值(false),0 等于。

          要在 PHP 中检查类型和值的完全匹配,您必须使用 === 而不是 ==

          【讨论】:

            猜你喜欢
            • 2021-12-27
            • 2014-05-13
            • 2013-12-10
            • 2015-09-21
            • 2015-10-30
            • 1970-01-01
            • 1970-01-01
            • 2016-10-23
            • 1970-01-01
            相关资源
            最近更新 更多