• in_array 判断问题的疑惑解决。


    面试题中有一条是关于in_array判断的,题目如下:

    如何大家没有深入了解in_array的类型判断过程,而是根据经验来选择,肯定很多人也是是选择了D答案的,具体的原因我也是从牛人的博客里面得到答案的,如下:

    摘录如下:

    1.情况一

    $test = 'a';

    $array = array('a', 'b', 'c');

    if (in_array($test, $array)) {

    echo 'in array';

    } else {

        echo 'no';

    }

    //output: in array

     

     

    2.情况二

    $test = 'other value';

    $array = array('a', 'b', 'c');

    if (in_array($test, $array)) {

    echo 'in array';

    } else {

        echo 'no';

    }

    //output: no

    ------------------------ 看似一切都正常的分割线 -----------------------

    3.情况三

     

    $test = 0;

    $array = array('a', 'b', 'c');

    if (in_array($test, $array)) {

        echo 'in array';

    } else {

        echo 'no';

    }

    //output: in array

    难以置信,这不坑爹吗,0不在列表中,但是这个函数返回true。这个函数很常用,所以当某些巧合出现后,就会导致不可预料的错误。

    一开始我猜测in_array函数除了在values中寻找,还会去寻找keys,后来发现不是这样的。


     

    4.情况四

     

    $test = '0';

    $array = array('a', 'b', 'c');

    if (in_array($test, $array)) {

        echo 'in array';

    } else {

        echo 'no';

    }

     

    //output: no

    是不是很有意思


    5.原来是因为:

    http://www.php.net/manual/en/language.operators.comparison.php

    var_dump(0 == "a"); // 0 == 0 -> true
    var_dump("1" == "01"); // 1 == 1 -> true(本题的答案)
    var_dump("10" == "1e1"); // 10 == 10 -> true
    var_dump(100 == "1e2"); // 100 == 100 -> true

    php比较数字和字符串时,会尝试将字符串转换为数字再进行比较。 例子中的 'a', 'b', 'c' 转成数字都是0,所以和0相等,in_array就返回了true。


    6.如何避免

    PHP的类型戏法是把双刃剑,有时候很爽,有时候很贱。

    所以当in_array的needle与array中的值类型是否相同还不确定时,最好设置in_array函数的第三个参数 strict = true,这样在检查的时候会检查类型,数字与字符串就不会偷偷相等,也就避免类似这种问题。

     

    $test = 0;

     

    $array = array('a', 'b', 'c');

    if (in_array($test, $array, true)) {

        echo 'in array';

    } else {

        echo 'no';

    }

     

     

    //output: no

  • 相关阅读:
    三点求圆心坐标(三角形外心)
    半平面交
    旋转卡壳
    平面最近点对(HDU 1007)
    凸包
    ACM做题随做随思
    最短路径——SPFA算法
    树链剖分原理
    生成树的计数——Matrix-Tree定理
    次小生成树
  • 原文地址:https://www.cnblogs.com/wendong/p/3816648.html
Copyright © 2020-2023  润新知