まず、なぜ割り当てを$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);
}
次に、ループを 1 行にする方法が既にあります。より短い変数名を使用し、中かっこを削除して (その中には 1 つのステートメントしかないため)、これら 2 つのステートメントを 1 行に記述します。このような:
$tpl = "<div>[@ data]</div>";
$data = array('hello', 'hi', 'hola');
$pat = '/\\[@ data\\]/is';
$res = ''; foreach ($data as $val) $res .= preg_replace($pat, $val, $tpl);
しかし、短い変数名が気に入らない場合は、がんばってください。これらの長い変数名で 1 行のコードを作成できるとは思いません。ただし、長い長い行があります:D
ループ置換については、関数型プログラミングについて理解している必要があります。array_map
ループを交換して使用できます。1行のコード(または私が推測する1つのステートメントコード)にするためには、無名関数を の引数として利用する必要があります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 ループを使用する必須の方法は、今のところより良い方法だと思います。