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)" を false と見なします。

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

このようなものが維持しやすいかどうかはわかりません。これらのif条件で何か他のことをするかどうかによって異なります。ただし、構成ファイル 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 に答える