5

PHP 関数 preg_match を使用する独自のカスタム関数を介して値の配列を実行する PHP スクリプトがあります。正規表現が $valueA で、検索する文字列が $valueB である一致を探しています。一致が見つかった場合は、それを $match に返します。それ以外の場合は、IF ステートメントを実行したくありません。

関数が一致する場合 (つまり、TRUE の場合) は、この IF ステートメントの実行に問題はありません。

if ($match = match_this($valueA, $valueB))
{
    //do this
}

ただし、追加の条件を比較してそれも TRUE かどうかを確認し、両方が TRUE の場合にのみ IF ステートメントを実行すると、問題が発生します。

if ($match = match_this($valueA, $valueB) && $x == 'x')
{
    //do this
}

両方の条件が TRUE の場合に通常どおりステートメントを実行する代わりに、$match の値が本来あるべき値ではなく、$match から 1 を出力してしまいます。

何が起こっているのか、なんとなくわかります。私の IF ステートメントは、match_this(); から返された値ではなく、リテラルのブール値 TRUE を $match に返すだけです。

TRUEの感覚しか返せないからですか?

ネストされた 2 つの IF ステートメントを使用することで問題を回避できますが、コードをきれいにするために、値を返す関数を含む IF で複数の条件を比較できるようにしたいと考えています。

TRUE にはさまざまな種類がありますか? もしそうなら、どうすればこのように比較できますか?それとももっと簡単な方法はありますか?関数内に 2 番目の IF ステートメントを配置して、関数を介して 2 番目の条件を渡すことができると思いますが、その場合、関数はその目的に関して明確に定義されません。

以前にこの問題に遭遇したことがありますが、探しているものがよくわかりませんでした。誰かが助けてくれることを願っています。

4

2 に答える 2

5
if (($match = match_this($valueA, $valueB)) && $x == 'x') 
    ^                                     ^

ブラケットの余分なセットがありません。を囲む余分な括弧のセットがない$match = match_this($valueA, $valueB)場合、 の評価が&&最初に実行され、最後に結果が に割り当てられ$matchます。

または、代わりandに(割り当てよりも優先順位が低い=)を使用できます。&&

PHP 演算子の優先順位

于 2012-10-26T14:34:19.667 に答える
0
if ($match = match_this($valueA, $valueB))
           ^---wrong operator

==等価テストに使用する必要があります。今は、match_this の戻り値を代入しているだけです。他の if() についても同様

以下のコメントのように、実際に if() 構造内で割り当てを行いたい場合は、コードの上に非常に大きく点滅するネオンのように明るいコメント/警告を平手打ちして、これが意図された動作であることを示す必要があります。ほとんどの言語では、後でこのコードを見るほとんどの人は、それがタイプミスであると想定し、割り当てを等価テストに変更します。

于 2012-10-26T14:34:31.587 に答える