【问题标题】:PHP array_search function not working properly with return valuesPHP array_search 函数无法正常使用返回值
【发布时间】:2018-10-09 05:57:34
【问题描述】:

今天,我发现 php array_search 函数有一个很奇怪的问题。实际上,我应用的条件是,如果 index 为 0 或更大,则它应该通过 IF 条件,否则不会通过,但它不会像那样运行。

我分析发现,如果输出为FALSE,那么(FALSE >= 0)它也通过了比较值的条件,不知道为什么。谁能解释一下这个问题?

这似乎不是 array_search 功能问题,但我在使用此功能时遇到了问题。

$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';
}

PHP 手册:http://php.net/manual/en/function.array-search.php

【问题讨论】:

  • 它没有返回falsearray_search 返回找到搜索值的索引,或者在未找到时返回 false。您的示例中的返回值为00 !== false。 TL;DR - 对返回值使用严格比较。
  • echo $output 提供了什么?
  • 如果您尝试使用不存在的值,则将返回 FALSE。您可以尝试使用 var_dump。
  • 好的,但是当使用松散比较检查时,0 == false -> true,而0 === false -> false
  • 您链接的 php 手册页有一个警告框,解释了可能的返回值的危险

标签: php


【解决方案1】:

I analysed and found, if output is FALSE then ( FALSE >= 0) its also passing the condition with comparing value, don't know why. Can anyone explain this problem ?

查看http://php.net/manual/en/language.operators.comparison.php上的与各种类型的比较

根据此表,如果您将布尔值与任何其他类型进行比较,则两个值都会转换为布尔值,然后进行比较。在您的情况下,整数0 被转换为FALSE,最终php 比较FALSE >= FALSE。 由于FALSE 大于或等于FALSE,你的条件返回真。

【讨论】:

  • 这似乎是正确的,但仍然有一个问题,这是逻辑错误还是 PHP 错误?
  • 这是预期和记录的行为,所以绝对不是 PHP 错误。 PHP 是松散类型的语言,因此开发人员必须找到一种方法来比较不同的类型。他们就是这样处理的
  • 从逻辑上讲,如果您确实将布尔值与 int 进行比较,我会说这种行为是非常合乎逻辑的。但比较本身并没有多大意义。然而,它是否合乎逻辑的问题似乎更像是基于意见的
  • 我用 javascript 对它进行了很少的研究,它的行为与布尔值 (false) 相同,但与字符串值的行为不同。 /* Javascript 代码 / var test = 'sdf';如果(测试> = 0){警报(“嗨”); } / PHP 代码 */ $test = 'sdf'; if($test >= 0){ echo '=='; }
【解决方案2】:

您需要使用===,因为它会检查值并检查值的类型,这样它就不会像您的情况那样通过条件。它正在检查值,但没有检查导致问题的类型,因为它将false 视为字符串,这显然是真实的条件(字符串的值大于0)。

$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';
}

【讨论】:

  • 我知道解决方案,但我想问为什么会这样?
  • 因为它返回 false 您正在使用 == 进行比较,它只检查值,在您的情况下,false 被视为字符串,any string > 0 始终这就是原因
  • 我没有提到 == 到任何地方。
  • >= 我的意思是这个,它正在检查值
  • 你可以做 var_dump 来检查数据类型。它返回的布尔值不是字符串类型的数据。
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多