3

私は次の機能を持っています。
表示されているように、それを実行して true か false か、またはその逆かをテストできます。

    $fname=$_POST['fname'];
    $lname=$_POST['lname'];

function namecheck ($fname,$lname) 
{    
    $names= array ($fname,$lname);

    $regexp ="/^[A-Za-z]+$/";

    //filter through names 
    for ($i=0; $i<2; $i++)
    if (! preg_match($regexp, $names[$i])) 
    {
         return false;
    }
    return true;
}

(別バージョン):

for ($i=0; $i<2; $i++)
if (preg_match($regexp, $names[$i])) 
{
    return true;
}
return false;

効率と優れたコーディング手法の両方の観点から、これを記述するより良い方法はどれですか? それとも違いはありませんか?

このような小さな配列では問題にならないかもしれませんが、より大規模で複雑なプログラムにどのような影響を与えるのか疑問に思っています。

4

3 に答える 3

9

違いは、両方のループが異なる結果をチェックしていることです。

  • 最初のループは、配列のすべての要素に一致するかどうかをチェック$regexpします。この場合、false一致が失敗するとすぐに戻り、for ループの後の return ステートメントに到達すると、すべての要素が一致することを意味します。
    正直なところ、forループの周りに中括弧がないことは、しばしば混乱を招く可能性があります (最初に私を混乱させたように)。関連するブレースを追加することをお勧めします:

    for ($i=0; $i<2; $i++) {
        if (preg_match($regexp, $names[$i])) {
             return true;
        }
    }
    return false;
    
  • 2番目のループは、配列のいずれかの要素と一致するかどうかをチェックします$regexp。この場合、true一致が成功するとすぐに戻ります。for ループの後の return ステートメントに到達すると、要素が一致しないことを意味します。

    for ($i=0; $i<2; $i++) {
        if (! preg_match($regexp, $names[$i])) {
             return false;
        }
    }
    return true;
    
于 2013-08-10T08:32:05.390 に答える
4

is_name_valid() のように、関数にわかりやすい名前を付けることをお勧めします。名前が要件を満たしている場合は True を返す必要があり、そうでない場合は False を返す必要があるため、明確になり、「問題」はすぐに解消されます。

于 2013-08-10T08:38:09.013 に答える
4

あなたのコードでは、1 回の反復 ($i = 0) のみをチェックします。

あなたが使用することができます:

for ($i=0; $i<2; $i++){
    if (!preg_match($regexp, $names[$i])) return false;
}
return true;

エラーがある場合、メソッドは false を返し、ない場合 -> true を返します。メソッドは、最初のエラーで反復を停止します。

于 2013-08-10T08:34:09.063 に答える