基于尝试使我的代码更高效的2个简短问题(我认为我的最终任务是基于某种MVC框架制作我的整个(相当复杂的)网站,但不是专业程序员,我认为这样做成为一个漫长而陡峭的学习曲线..)
在这段代码中,有没有办法合并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";
}
}
目前,我做了一个相当标准的事情,即从表单提交中拆分我的$ _POST数组,“清理”内容并将元素存储在各个变量中:
$name = cleanInput($_POST['name']);
$phone = cleanInput($_POST['phone']);
$message = cleanInput($_POST['message']);
...
(其中cleanInput()
包含striptags()
和mysql_real_escape_string()
)
我原本以为将所有信息保存在数组中可能会使我的代码更有效,但有没有办法将函数应用于数组的所有(或选定)元素?例如,在R中,这就是apply()
函数的作用。
或者,假设我的所有变量都与$_POST
数组中的名称相同,是否有办法在foreach
循环中动态生成所有变量? (当人们问他们是否可以动态生成变量时,我知道标准答案是使用散列图或类似的,但我有兴趣看看是否有我错过的技术)
答案 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";
}