0

これをより効率的にする方法に苦労しています。ループを単線にすることはできますか?

編集:ループを交換しようとしています。

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

2 に答える 2

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

于 2013-02-01T19:57:59.217 に答える
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);
}

次に、ループを 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 ループを使用する必須の方法は、今のところより良い方法だと思います。

于 2013-03-16T01:03:39.633 に答える