PHP数组_搜索函数不能正常使用返回值
今天,我发现phparray\u search函数有一个非常奇怪的问题。实际上,我应用了一个条件,如果索引0或大于,那么它应该通过if条件,否则不是,但它的功能不是这样的 我分析发现,如果输出是FALSE,那么(FALSE>=0)它也通过了比较值的条件,不知道为什么。有人能解释这个问题吗 这似乎不是array\u search函数问题,但我在使用该函数时遇到了这个问题PHP数组_搜索函数不能正常使用返回值,php,Php,今天,我发现phparray\u search函数有一个非常奇怪的问题。实际上,我应用了一个条件,如果索引0或大于,那么它应该通过if条件,否则不是,但它的功能不是这样的 我分析发现,如果输出是FALSE,那么(FALSE>=0)它也通过了比较值的条件,不知道为什么。有人能解释这个问题吗 这似乎不是array\u search函数问题,但我在使用该函数时遇到了这个问题 PHP手册:您需要使用==,因为它会检查值,也会检查值的类型,以便在您的情况下不会通过条件。它正在检查值,但没有检查导致问题的类
PHP手册:您需要使用
==
,因为它会检查值,也会检查值的类型,以便在您的情况下不会通过条件。它正在检查值,但没有检查导致问题的类型,因为它将false
视为明显为真的字符串(字符串的值大于0)
我分析发现,如果输出为FALSE,那么(FALSE>=0)它也通过了条件和比较值,不知道为什么。有人能解释这个问题吗?
查看不同类型的比较表
根据此表,如果将布尔值与任何其他类型进行比较,则这两个值都将转换为布尔值,然后进行比较。在您的例子中,整数0
被转换为FALSE
,最终php比较FALSE>=FALSE
。
由于
FALSE
大于或等于FALSE
,您的条件返回true。它不会返回FALSE
array\u search
返回搜索值所在的索引,如果未找到,则返回false
。示例中的返回值为0
<代码>0!==错误。TL;DR-对返回值进行严格比较。echo$output
给出了什么?如果尝试使用不存在的值,则将返回FALSE。您可以尝试使用var_dump.ok,但是当使用松散的比较检查时,0==false->true
,而0===false->false
。您链接的php手册页面上有一个警告框,解释了可能返回值的危险。我知道解决方案,但我想问为什么会发生这种情况?当它返回false时,您正在使用=
进行比较,它只检查值,在您的案例中,false
被视为一个字符串和any string>0
始终是我没有提到的原因==到任何地方。=
我只是指这一个,它是检查值,您可以执行var\u dump来检查数据类型。它返回的布尔值不是字符串类型的数据。它看起来是正确的,但仍然有一个问题,这是一个逻辑错误还是一个PHP错误?这是预期和记录的行为,所以肯定不是PHP错误。PHP是一种松散类型的语言,因此开发人员必须找到一种方法来比较不同的类型。这就是他们在逻辑上处理它的方式,如果你真的比较布尔和int,我会说这种行为是非常合乎逻辑的。但比较本身并没有多大意义。然而,问题是它是否符合逻辑,似乎更像是Observision basedI使用javascript对它进行了很少的研究,它的行为与布尔值(false)相同,但与字符串值的行为不同Javascript代码/var test='sdf';如果(test>=0){alert('hi');}/PHP代码*/$test='sdf';如果($test>=0){echo'=';}
$allowedJobCodesForCC = array( "xyz", "abc");
/* output if value not found in array
var_dump(array_search(strtolower(trim('xyzfd')), $allowedJobCodesForCC));
*/
$output = array_search(strtolower(trim('xyz')), $allowedJobCodesForCC); //output : false
/* array_search function treating false return value and passing it to the condition */
if($output >= 0){
echo 'passed'; //it should not print this condition if return value is FALSE
}
/* correct fix if indexes are numeric */
if(is_numeric($output)){
echo 'passed';
}
$allowedJobCodesForCC = array("xyz", "abc");
/* output if value not found in array
var_dump(array_search(strtolower(trim('xyzfd')), $allowedJobCodesForCC));
*/
$output = array_search(strtolower(trim('xyz')), $allowedJobCodesForCC); //output : false
/* array_search function treating false return value and passing it to the condition */
if ($output === False && $output !== 0) {
echo 'not passed'; //it should not print this condition if return value is FALSE
} else {
echo 'passed';
}