3

我有以下功能。
我可以运行它来测试是否为真,否则为假,反之亦然,如图所示。

    $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;
    
  • 第二个循环检查是否$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

在您的代码中,您将只检查一次迭代 ($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 回答
4

我建议给你的函数起一个更有意义的名字,比如 is_name_valid()。它有助于清晰,您的“问题”将立即消失,因为当名称满足您的要求时它必须返回 True 否则返回 False 。

于 2013-08-10T08:38:09.013 回答