0

我正在努力寻找一种提高效率的方法。是否可以将循环变成单行?

编辑:寻找替换循环。

$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);
4

2 回答 2

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);
}

在此处查看实际操作:http ://codepad.viper-7.com/OuxEUT

于 2013-02-01T19:57:59.217 回答
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);
}

其次,您已经有一种方法可以将循环变成一行。只需使用较短的变量名,删除花括号(因为它只是其中的一个语句),然后将这 2 个语句写入一行。像这样:

$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 循环的命令式方法仍然是更好的方法。

于 2013-03-16T01:03:39.633 回答