Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 模板中的Preg_替换模式_Php_Preg Replace_Pattern Matching_Datatemplate_Template Engine - Fatal编程技术网

Php 模板中的Preg_替换模式

Php 模板中的Preg_替换模式,php,preg-replace,pattern-matching,datatemplate,template-engine,Php,Preg Replace,Pattern Matching,Datatemplate,Template Engine,我正在努力寻找一种更有效的方法。有没有可能把环路变成一条线 编辑:寻找替换循环 $template = "<div>[@ data]</div>"; $arrayData = array('hello', 'hi', 'hola'); foreach ($arrayData as $dataValue) { $fillPattern = '/\\[@ data\\]/is'; $arrayTemplate .= preg_replace($fillPa

我正在努力寻找一种更有效的方法。有没有可能把环路变成一条线

编辑:寻找替换循环

$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);
$template=“[@data]”;
$arrayData=array('hello','hi','hola');
foreach($arrayData作为$dataValue){
$fillPattern='/\\[@data\\]/is';
$arrayTemplate.=preg_replace($fillPattern,$dataValue,$template);
}
$viewContent=preg_replace($pattern、$arrayTemplate、$viewContent);

在启动循环之前,应将
$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);
}
$template=“[@data]”;
$arrayData=array('hello','hi','hola');

$arrayTemplate='';// 首先,为什么要将赋值放到循环中的
$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);
但是如果您没有PHP5.3或更新版本,您可以像这样使用
create\u函数

$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));
或:


你看,PHP最初是一种命令式过程语言。它最初不是作为函数式语言设计的。所以,我想现在使用foreach循环的命令式方法仍然是更好的方法。

好吧,是的,但我的意思是没有循环。@osocrealler-我不知道没有循环的情况下有什么方法可以做到这一点,但我不认为这是低效的……这可能是@Quasdunk的一个好问题,他没有要求进行代码审查,他问是否有更有效的方法来编写它。@alfasin这正是他们在codereview上所做的:)更少的代码!=更有效的扣篮不完全是。。。我觉得:
$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));