为啥使用 !== FALSE 来检查 php 中的 stripos?
Posted
技术标签:
【中文标题】为啥使用 !== FALSE 来检查 php 中的 stripos?【英文标题】:Why use !== FALSE to check stripos in php?为什么使用 !== FALSE 来检查 php 中的 stripos? 【发布时间】:2010-10-16 12:24:54 【问题描述】:这是我正在查看的代码。
foreach ($header as $idx => $field)
if (stripos($field, 'foo') !== false)
$cols['foo'] = $idx;
else if (stripos($field, 'bar') !== false)
$cols['bar'] = $idx;
else if (stripos($field, 'brr') !== false)
$cols['brr'] = $idx;
else if (stripos($field, 'ffo') !== false)
$cols['ffo'] = $idx;
对不起,也不知道如何漂亮地格式化代码,任何提示都将不胜感激。
我正在查看一些比我聪明得多的人编写的代码,所以我不倾向于相信我的第一印象只是将所有内容都更改为 if(stripos($foo))
,但为什么要这样做?
【问题讨论】:
要格式化代码,请添加四 (4) 个前导空格 【参考方案1】:答案是,在 php 中,“假”值可以由少数几个值来满足,例如空数组、空字符串、NULL、整数 0 等。请参阅 empty() 函数页面以获取完整列表:
http://php.net/empty
所以这会总是产生不正确的结果:
if(strpos("abc", "a"))
echo "Yes";
else
echo "No";
因为“a”出现在第一个位置(索引 0),所以 PHP 认为“if (0)”为假。
当 strpos 没有在你的大海捞针中找到针时,它将返回布尔值 FALSE,这是你想用三等号运算符检查类型和值的结果。请参阅有关比较运算符的文档
http://www.php.net/manual/en/language.operators.comparison.php
【讨论】:
这不是一个“不正确”的结果,因为您对正确性的看法与语言不兼容。找到针的正确方法会给你正确的结果。 @PJBrunet 从所需逻辑的角度来看不正确...不是语言...【参考方案2】:stripos返回一个字符串在另一个字符串中的位置,如果没有找到则返回false,所以推荐使用标识comparison operators(===, !==),因为PHP考虑0 作为“虚假”值,请考虑以下示例:
// Find the position of the 'a' character in the 'abc' string:
stripos('abc', 'a') !== false; // true, position is 0
stripos('abc', 'a') != false; // false, 0 is "falsy"
【讨论】:
【参考方案3】:在 PHP 中,!== 表示不同类型的 AND 值。
如果 stripos() 返回除 false 以外的任何值(并且完全是“false”,而不是零),这意味着它找到了一些东西,即使位置为 0 并且返回了 int(0)。 0 和 false 在使用 == 进行标准比较时相等,但在使用身份 === 运算符时不相等,因此唯一知道 stripos() 是否具有发现可以确定的是使用 !== 比较 false 的值和类型(不相同,即 strpos() 的返回值的类型和值都相同。)
【讨论】:
【参考方案4】:因为如果在位置 0 匹配的字符串,0 的计算结果为 false,所以请确保添加额外的 '=' 以便考虑该类型。
strpos()
在找到 NO 匹配时返回 false。
查看comparison operators。
【讨论】:
【参考方案5】:不知道这样的东西是否更容易维护。取决于你是否在这些条件下做其他事情。但是您可以在配置文件 db 中设置键,作为参数传递给您的函数,或类似的。
$keys = array(
'foo',
'bar',
'brr',
'ffo',
);
foreach ($header as $idx => $field)
foreach ($keys as $key)
if (stripos($field, $key) !== false)
$cols[$key] = $idx;
break;
【讨论】:
以上是关于为啥使用 !== FALSE 来检查 php 中的 stripos?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 null 函数而不是 == [] 来检查 Haskell 中的空列表?
为啥在 PHP (-1 > false) 中返回 true? [复制]
为啥滚动网格中的 jqxgrid 未选中复选框或单选按钮列?
php 编程,使用file_get_contents('http://www.vketch.com/')获取远程页面超时为啥不会返回false