这是记录在案的行为:
http://php.net/array_search
http://php.net/manual/en/types.comparisons.php
http://www.php.net/manual/en/language.types.type-juggling.php
警告
此函数可能返回布尔值 FALSE,但也可能返回计算结果为 FALSE 的非布尔值。请阅读有关布尔值的部分以获取更多信息。使用 === 运算符测试此函数的返回值。
还要确保您知道这一点:
严格的
如果第三个参数 strict 设置为 TRUE,则 array_search() 函数将在大海捞针中搜索相同的元素。这意味着它还将检查大海捞针的类型,并且对象必须是相同的实例。
===
如果您不想陷入 PHP 弱类型比较的黑暗深渊,则应该使用严格的比较运算符:
php > var_dump(0 == "0afca13435"); // oops, password's hash check went wrong :)
bool(true)
php > var_dump(0 == false);
bool(true)
BUT:
php > var_dump(false == "0afca13435");
bool(false)
// Uh, oh :) that's because int and string comparison will cast string to int,
// and in php string->int cast will return either 0 or any numeric prefix the
// string contain; bool and string comparison will cast string to bool, and
// numeric prefix is no longer an issue
----------
php > var_dump(false == "");
bool(true)
php > var_dump(0 == "");
bool(true)
// WTF! :)
并严格:
php > var_dump(0 === "0afca13435");
bool(false)
// ahh, much better