高效的if语句/ for循环

时间:2012-03-29 10:11:42

标签: php coding-style

基于尝试使我的代码更高效的2个简短问题(我认为我的最终任务是基于某种MVC框架制作我的整个(相当复杂的)网站,但不是专业程序员,我认为这样做成为一个漫长而陡峭的学习曲线..)

  1. 在这段代码中,有没有办法合并if语句和for循环,以避免嵌套:

    if($fileatt['name']!=null)
    {
      $attachedFiles = "You uploaded the following file(s)\n";
      for($i=0;$i<count($docNames);$i++)
      {
        $attachedFiles = $attachedFiles. " - " . $docNames[$i] . "\n";
      }
    }
    
  2. 目前,我做了一个相当标准的事情,即从表单提交中拆分我的$ _POST数组,“清理”内容并将元素存储在各个变量中:

    $name = cleanInput($_POST['name']);
    $phone = cleanInput($_POST['phone']);
    $message = cleanInput($_POST['message']);
    ...
    
  3. (其中cleanInput()包含striptags()mysql_real_escape_string()

    我原本以为将所有信息保存在数组中可能会使我的代码更有效,但有没有办法将函数应用于数组的所有(或选定)元素?例如,在R中,这就是apply()函数的作用。

    或者,假设我的所有变量都与$_POST数组中的名称相同,是否有办法在foreach循环中动态生成所有变量? (当人们问他们是否可以动态生成变量时,我知道标准答案是使用散列图或类似的,但我有兴趣看看是否有我错过的技术)

5 个答案:

答案 0 :(得分:4)

您可以使用extract并将其与array_map

结合使用
extract(array_map('cleanInput', $_POST), EXTR_SKIP);

echo $name; // outputs name

警告$ _POST could be然后用户可以向您的服务器提交任何内容,它会成为您代码中的变量,因此如果您有类似的内容

if(empty($varName)) { } // assumes $varName is empty initially

用户提交$_POST['varName'] = 1

可以轻松绕过

为了避免这样的意外,你可以拥有一个数组白名单并过滤掉你需要的那些:

$whitelist = array('name', 'phone', 'message');
$fields = array();

foreach($_POST as $k => $v) {
   if(in_array($k, $whitelist)) $fields[$k] = $v;
}

extract(array_map('cleanInput', $fields));

答案 1 :(得分:1)

我个人认为使用“If”语句的性能成本值得拥有易于阅读的代码。如果有这样的方法,你必须确保通过组合实际使用更少的周期。

我不确定我是否按照你的第二个问题,但你看过extract()和array_walk()了吗?

答案 2 :(得分:1)

1)关于第一个问题,如何合并if和for循环:

为什么要合并它,它只会使代码更难以阅读。如果您的代码需要if,然后需要for循环,那么显示这个事实,那就没什么不好了。如果你想让代码更具可读性,那么你可以编写一个具有拟合名称的函数,例如: listAttachedFiles()

2)关于清理用户输入的问题:

输入验证转义之间存在差异。验证输入是一件好事,例如:如果你期望一个数字,那么只接受数字作为输入。但是在你知道目标系统之前不应该进行转义。所以保持输入不变,在写入数据库之前使用mysql_real_escape_string()函数,在写入HTML页面之前使用函数htmlspecialchars()

在需要之前组合转义函数会导致数据无效。在某个目标系统上,无法正确地发布它。

答案 3 :(得分:0)

第1点是过早优化。并且您希望通过这样做获得更好的性能/可读性。 (类似于为所有事物使用数组)。

第2点 - AaaarrgghhH!您应离开PHP 的位置更改数据的表示形式,使用方法 approporiate 到目的地 - 而不是它到达的位置PHP。

答案 4 :(得分:0)

使你的for循环更有效不要在循环的条件内使用Count()。

这是他们在学校教的第一件事。因为For循环正在重新评估每次迭代的条件。

$nbOfDocs = count($docNames); //will be much faster
for($i=0;$i<$nbOfDocs;$i++)
{
   $attachedFiles = $attachedFiles. " - " . $docNames[$i] . "\n";
}