0

テンプレートのセットを含むテーブルがあります。これらのテンプレートには、キーと値のペアの配列を指定して、実行時に置き換える必要があるプレースホルダーがあります。置換を行うための私のコードは次のとおりです。

function replace_placeholders(&$input_values) {
    $result = execute_pdo_query("SELECT name,value FROM templates");
    foreach($result as $currow) {
        $varname = $currow[name];
        $varvalue = $currow['value'];
        foreach($input_values as $key => $value) {
            $key = '{'.strtolower($key).'}';
            $varvalue = str_replace($key,trim($value),$varvalue);
        }
        $input_values[$varname] = $varvalue;
    }
}

問題は、多数のテンプレートと多くのキーと値のペアがあることです。したがって、このネストされたループは何度も実行され、ほぼ 0.5 秒かかります。この置換を最適化する方法はありますか? 私は最適化を探しましたが、ほとんどの場合、それstr_replaceが最善の方法であると言われています。

4

1 に答える 1

1

$input_valuesが含まれているかは示されていませんが、これは置き換えられる可能性のあるすべてのタグのグローバルリストであると思います。

この場合、明らかな弱点の 1 つは、テンプレートごとにこれをループすることです。テンプレートにたまたまタグが 1 つしかない場合、これは無駄です。

各テンプレートの可能なすべてのタグをループするのではなく、テンプレートで言及されているタグのみをpreg_replace_callback. これがより高速になるとは保証できませんが、最初に試してみたいことです。

簡単な例を次に示します。

$transformations = array(
    'name'     => 'John',
    'pronoun'  => 'you'
    'animal'   => 'dog'
    'building' => 'house'
    'food'     => 'chocolate'
    'friend'   => 'Kelvin'
    /* etc, potentially many more */
);
$template = "hello, {name}, how are {pronoun}?";

$transformed_template = preg_replace_callback('/\{(\w*)\}/', function($match) {
    global $transformations;
    if (isset($transformations[$match[1]]))
      return trim($transformations[$match[1]]);
}, $template);

テンプレートには 2 つのプレースホルダーのみが含まれており、$transformations.

(私は無名関数を へのコールバックとして使用していることに注意してくださいpreg_replace_callback()。PHP < 5.3 を使用している場合は、代わりに名前付き関数が必要になります。)

于 2012-07-29T10:42:44.857 に答える