0

我正在努力提高效率。是否有可能使循环成一条线?Preg_替换模板中的模式

编辑:期待取代循环。

$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

这可能是一个很好的问题http://codereview.stackexchange.com/questions – Quasdunk

+0

@Quasdunk他没有要求代码审查,他问是否有一个更有效的写作方式。 – alfasin

+1

@alfasin这就是他们在codereview :) :) – Quasdunk

回答

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

但是,如果你不喜欢较短的变量名称,祝你好运男人。我不认为你可以用这些长变量名作出单行代码。除了你有一个looong 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循环的命令方式仍然是更好的方法。

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

+0

嗯,是的,但我的意思是没有一个循环。 – osoclever

+0

@osoclever - 我不知道有没有循环做到这一点,但我不认为这是低效的... –