为什么array_search不匹配?

时间:2018-02-19 13:32:23

标签: php arrays

为什么示例A失败,但示例B有效?

A)失败:

  $request_IP = '8.8.8.8';
  $list_Array = explode(',', "8.8.8.8,9.9.9.9,2.2.2.2");

  $result = array_search($request_IP, $list_Array);
  if($result) {
    // Expecting - to get it success there 
  }
  else {
    echo "FAIL";
    exit;          
  }

B)工作:

  $request_IP = '8.8.8.8';
  $list_Array = explode(',', "0,8.8.8.8,9.9.9.9,2.2.2.2");

  $result = array_search($request_IP, $list_Array);
  if($result) {
    // In this case it works??
  }
  else {
    echo "FAIL";
    exit;          
  }

4 个答案:

答案 0 :(得分:2)

来自the documentation for array_search

  

如果在数组中找到的键,则返回 FALSE 的键

因此,您应该将代码更改为:

$result = array_search($request_IP, $list_Array);
if ($result === false) {
    // Not found
    echo "FAIL";
    exit;
} else {
    // $result is the key of the element in the array
    echo $result . "\n";
}

答案 1 :(得分:2)

示例A匹配正确,它返回索引0。

0是一个假变量。 0 == false

  

在布尔列中进行松散比较(两个==)时,查看https://secure.php.net/manual/en/types.comparisons.php哪种值匹配哪种结果

你可以更好地翻转if语句,首先测试false。 我们不需要"否则"这里因为代码将在if语句中中止,或者它将继续 保存缩进级别。

if($result === false) {
    echo "FAIL";
    exit;          
}
// success

三个===表示与值和类型完全匹配

答案 2 :(得分:1)

那是因为在A节中, array_search($request_IP, $list_Array)将返回零。 所以下一个条件行将编译如下:

if ($result)      // if (0)

此条件将始终返回false。

解决此问题。你必须使用以下行

if ($result === FALSE)

答案 3 :(得分:1)

因为在你的第一个例子中,array_search将返回0 - 因为第一个出现的是8.8.8.8是第一个项目。 PHP被设计为弱的",因此断言" 0"和布尔值false将为真(false == 0),断言1和true也将为真(true == 1)。这可能非常棘手 - 例如,如果模式位于字符串的开头,则strpos返回0,在这种情况下,您需要编写类似(strpos($string, $search) !== false)的条件 - 只需检查返回类型"弱& #34;会导致逻辑错误(!strpos($string, $search)

你必须采用这个条件。

我建议使用in_array

if (in_array($request_IP, $list_Array) === true)

会做

您还应该看看这个问题: What are the benefits (and drawbacks) of a weakly typed language?

弱类型设计是不错的,它的概念,如果你使用PHP或任何其他弱类型的语言进行业务逻辑,你需要格外小心,只使用严格的比较(===而不是==,!= =而不是!=显式比较而不是否定)是一个好的开始。