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 - 我不知道有沒有循環做到這一點,但我不認爲這是低效的... –