我有以下功能。
我可以运行它来测试是否为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;
在效率和良好的编码实践方面,哪种方式更好?或者没有区别?
对于像这样的小阵列来说,这可能不是问题,但我想知道它会对更大更复杂的程序产生什么影响。
答案 0 :(得分:9)
不同之处在于两个循环都在检查不同的结果。
1 st 循环正在检查$regexp
是否匹配数组的所有元素 - 在这种情况下,它会在匹配时返回false
失败,如果达到for循环后的return语句,则表示所有元素都匹配
说实话,在for
循环周围没有括号通常会让人感到困惑(就像它先把我弄糊涂了)。我建议添加相关的括号:
for ($i=0; $i<2; $i++) {
if (preg_match($regexp, $names[$i])) {
return true;
}
}
return false;
2 nd 循环正在检查$regexp
是否匹配数组的任何元素 - 在这种情况下,只要匹配成功,它就会返回true
,如果达到for循环后的return语句,则表示没有元素匹配。
for ($i=0; $i<2; $i++) {
if (! preg_match($regexp, $names[$i])) {
return false;
}
}
return true;
答案 1 :(得分:4)
在您的代码中,您只需检查一次迭代($ i = 0)
您可以使用:
for ($i=0; $i<2; $i++){
if (!preg_match($regexp, $names[$i])) return false;
}
return true;
如果有错误方法会返回false,如果没有 - &gt;真正。方法会在第一次错误时停止迭代。
答案 2 :(得分:4)
我建议给你的函数一个更有意义的名称,比如is_name_valid()。它有助于清晰度,您的“问题”会立即消失,因为当名称满足您的要求时它必须返回True,否则返回False。