为什么示例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;
}
答案 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或任何其他弱类型的语言进行业务逻辑,你需要格外小心,只使用严格的比较(===而不是==,!= =而不是!=显式比较而不是否定)是一个好的开始。