18

这是我正在查看的代码。

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

5 回答 5

52

答案是在 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

于 2009-03-30T23:56:46.230 回答
9

stripos返回一个字符串在另一个字符串中的位置,如果找不到该字符串,则返回 false,因此建议使用恒等比较运算符(===,!==),因为 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"
于 2009-03-30T23:57:47.927 回答
6

在 PHP 中,!== 表示不同类型的 AND 值。

如果 stripos() 返回 false 以外的任何值(并且完全是“false”,而不是零),这意味着它找到了一些东西,即使位置为 0 并且返回了 int(0)。0 和 false 在与==进行标准比较时相等,但在使用身份===运算符时不相等,因此知道 stripos() 是否确实找到某些东西的唯一方法是使用比较false的值和类型!== (不相同,即 strpos() 的返回值的类型和值相同。)

于 2009-03-31T00:05:04.807 回答
5

因为如果字符串在位置 0 匹配,则 0 的计算结果为 false,因此您确保添加额外的 '=' 以便考虑该类型。

strpos()未找到匹配项时返回 false 。

查看比较运算符

于 2009-03-30T23:54:37.763 回答
3

不知道这样的东西是否更容易维护。取决于你是否在这些条件下做其他事情。但是您可以在配置文件 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;
        }
    }
}
于 2009-03-31T07:24:37.090 回答