【问题标题】:PHP in_array issue while checking zero value in array giving truePHP in_array 问题,同时检查数组中的零值是否为真
【发布时间】:2013-06-21 10:01:07
【问题描述】:

在使用 PHP 的 in_array() 时,我遇到了一种奇怪的情况。以下是我的代码及其输出

<?php
$process = array("as12"=>"deleted","as13"=>1,"as14"=>1);
if(!in_array(0, $process))
    echo "success";
else
    echo "not success";

//It's outputting "not success";

var_dump(in_array(0, $process));
//Output : null

var_dump(in_array(0, $this->tProcessActions) === true);
///Output : true

如果我们查看$process 数组,其中没有0 值。如果我检查if(in_array(0, $process))

,它仍然是真实的

有人知道吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    如果您需要严格检查,请使用$strict选项:

    in_array(0, $process, true)
    

    众所周知,PHP 的字符串 ⟷ int 比较如果不了解规则/预期错误会很复杂。

    【讨论】:

    • 通过把true 最后一个参数解决了一个问题。我很久以前就看到了,当数组中有混合值时忘记添加,就像你说的string-int
    【解决方案2】:

    试试看

    if(!in_array('0', $process)) {
    

    或者你可以使用搜索(可选)类似

    if(array_search('0',$process)) {
    

    【讨论】:

    • +1 来自我。是的。你是对的。但是为什么我需要在引号中加上0?如果我在没有引号的情况下搜索 1,那么它会给出正确的结果。
    • 因为0 == "deleted" 使用松散比较。注意in_array 的第三个参数,它强制进行严格比较。也看看type comparison tables
    【解决方案3】:

    我认为您应该将0 放在引号内:

    if(!in_array("0", $process))

    【讨论】:

      【解决方案4】:

      我认为是因为 in_array 可能不是严格的类型检查。因为如果你检查

       if (0 == "deleted") echo "xx";
      

      【讨论】:

        【解决方案5】:

        试试这个

        if(!in_array('0', $process))
        

        【讨论】:

          【解决方案6】:

          使用strict 参数可以在这里得到你想要的:

          $process = array("as12"=>"deleted","as13"=>1,"as14"=>1);
          var_dump( in_array(0, $process, true ) );
          // gives false
          

          或使用array_search 并测试是否为非假;

          var key = array_search( 0, array( 'foo' => 1, 'bar' => 0 ) );
          // key is "bar"
          

          【讨论】:

            【解决方案7】:

            您需要使用 in_array 函数的第三个参数 [$is_strict]。

            in_array(0, $process, true)
            

            重点是任何字符串经过(int)转换后等于0。 (int)“已删除”=> 0。 因此,没有严格模式的 in_array 等于“已删除”== 0,这是真的。当你使用 strict 时,它等于“deleted” === 0 which false。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-30
              • 1970-01-01
              相关资源
              最近更新 更多