PHP's variable type leniency

后端 未结 3 1112
耶瑟儿~
耶瑟儿~ 2020-12-18 07:26

The most recent comment on PHP\'s in_array() help page (http://uk.php.net/manual/en/function.in-array.php#106319) states that some unusual results occur as a re

3条回答
  •  囚心锁ツ
    2020-12-18 08:11

    Internally, you can think of the basic in_array() call working like this:

    function in_array($needle, $haystack, $strict = FALSE) {
        foreach ($haystack as $key => $value) {
            if ($strict === FALSE) {
                if ($value == $needle) {
                    return($key);
                }
            } else {
                if ($value === $needle) {
                    return($key);
            }
        }
        return(FALSE);
    }
    

    note that it's using the == comparison operator - this one allows typecasting. So if your array contains a simple boolean TRUE value, then essentially EVERYTHING your search for with in_array will be found, and almost everything EXCEPT the following in PHP can be typecast as true:

    '' == TRUE // false
    0 == TRUE // false
    FALSE == TRUE // false
    array() == TRUE // false
    '0' == TRUE // false
    

    but:

    'a' == TRUE // true
    1 == TRUE // true
    '1' == TRUE // true
    3.1415926 = TRUE // true
    etc...
    

    This is why in_array has the optional 3rd parameter to force a strict comparison. It simply makes in_array do a === strict comparison, instead of ==.

    Which means that

    'a' === TRUE // FALSE
    

提交回复
热议问题