首先,你爲什麼把分配給$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循環的命令方式仍然是更好的方法。
這可能是一個很好的問題http://codereview.stackexchange.com/questions – Quasdunk
@Quasdunk他沒有要求代碼審查,他問是否有一個更有效的寫作方式。 – alfasin
@alfasin這就是他們在codereview :) :) – Quasdunk