以下是我正在查看的代码。
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))
,但为什么会这样呢?
答案 0 :(得分:49)
答案是在PHP中可以通过少量值来满足“false”值,例如空数组,空字符串,NULL,整数0等。请参阅empty()函数页面以获取完整清单:
所以这会总是产生不正确的结果:
if(strpos("abc", "a")) {
echo "Yes";
} else {
echo "No";
}
由于“a”出现在第一个位置(索引0),因此PHP认为“if(0)”为false。
当strpos在大海捞针中找不到针时,它将返回布尔值FALSE,这是你要用三等运算符检查的,它检查类型和值。请参阅有关比较运算符的文档
http://www.php.net/manual/en/language.operators.comparison.php
答案 1 :(得分:7)
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"
答案 2 :(得分:5)
因为如果字符串在位置0处匹配,则0的计算结果为false,因此您确保添加额外的'='以便考虑该类型。
strpos()
在找到 NO 匹配时返回false。
答案 3 :(得分:5)
在PHP中,!==表示不具有相同类型的AND值。
如果stripos()返回除false之外的任何内容(并且恰好为'false',而不是零),则表示它已找到某些内容,即使该位置为0且返回了int(0)。与 == 进行标准比较时0和false相等,但在使用身份 === 运算符时则不相等,因此了解stripos()是否有唯一的方法发现可以肯定的是比较 false 的值和类型使用!==(不完全相同,即strpos()的返回值的类型和值都相同。)
答案 4 :(得分:3)
Dunno如果这样的事情会更容易维护。取决于你是否在那些条件下做了其他事情。但您可以在配置文件中设置密钥,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;
}
}
}