我正在努力提高效率。是否可以将循环变成一行?
编辑:寻找替换循环。
$template = "<div>[@ data]</div>";
$arrayData = array('hello', 'hi', 'hola');
foreach ($arrayData as $dataValue) {
$fillPattern = '/\\[@ data\\]/is';
$arrayTemplate .= preg_replace($fillPattern, $dataValue, $template);
}
$viewContent = preg_replace($pattern, $arrayTemplate, $viewContent);
答案 0 :(得分:1)
在开始循环之前,您应该将$arrayTemplate
设置为空字符串:
$template = "<div>[@ data]</div>";
$arrayData = array('hello', 'hi', 'hola');
$arrayTemplate = ''; // <-- you forgot to declare this
foreach ($arrayData as $dataValue) {
$arrayTemplate .= preg_replace('/\\[@ data\\]/is', $dataValue, $template);
}
在此处查看:[{3}}
答案 1 :(得分:1)
首先,为什么要将赋值放入循环中的$fillPattern
?它的值不会因每次迭代而改变。你应该把它们放在循环之外,然后再放在循环之外。像这样:
$template = "<div>[@ data]</div>";
$arrayData = array('hello', 'hi', 'hola');
$fillPattern = '/\\[@ data\\]/is'; //<-- put it here
$arrayTemplate = '';
foreach ($arrayData as $dataValue) {
$arrayTemplate .= preg_replace($fillPattern, $dataValue, $template);
}
其次,你已经有办法将循环变成一行。只需使用较短的变量名,删除花括号(因为它里面只有一个语句),并将这两个语句写入一行。像这样:
$tpl = "<div>[@ data]</div>";
$data = array('hello', 'hi', 'hola');
$pat = '/\\[@ data\\]/is';
$res = ''; foreach ($data as $val) $res .= preg_replace($pat, $val, $tpl);
但如果你不喜欢较短的变量名,祝你好运。我不认为你可以使用那些长变量名来制作一行代码。除此之外,你有一个loooong looong线:D
对于循环替换,您应该了解函数编程。您可以使用array_map
替换循环。为了使它成为一行代码(或者我猜的一个语句代码),你必须使用匿名函数作为array_map
的参数。
使用PHP 5.3或更高版本,您可以使用以下代码:
$arrayTemplate = join('', array_map(
function($x) use ($fillPattern, $template) {
return preg_replace($fillPattern, $x, $template);
}, $arrayData));
但是如果你没有PHP 5.3或更新版本,你可以像这样使用create_function
:
$arrayTemplate = join('', array_map(
create_function('$x', 'global $fillPattern, $template;
return preg_replace($fillPattern, $x, $template);'
), $arrayData));
使用上面较短的变量名称,可以按如下方式重写这些代码:
$res = join('', array_map(function($x) use ($pat, $tpl) {
return preg_replace($pat, $x, $tpl);
}, $data));
或:
$res = join('', array_map(create_function(
'$x', 'global $pat, $tpl; return preg_replace($pat, $x, $tpl);'
), $data));
你知道,PHP最初是一种必要的程序语言。它首先不是作为一种功能语言而设计的。所以,我想现在使用foreach循环的必要方法仍然是更好的方法。