【问题标题】:Optimize String Replacement in an Array优化数组中的字符串替换
【发布时间】:2012-08-10 22:04:49
【问题描述】:

我有一个包含一组模板的表。这些模板有占位符,需要在运行时替换给定键值对数组。这是我进行替换的代码:

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;
    }
}

问题在于有大量的模板和许多键值对。所以,这个嵌套循环被执行了很多次,几乎占用了半秒。有没有办法优化这个替换?我已经搜索了优化,但大多数人说str_replace 是可以做到的最好的。

【问题讨论】:

    标签: php string optimization loops


    【解决方案1】:

    您没有向我们展示 $input_values 包含的内容,但我认为这是所有可能要替换的标签的全局列表。

    在这种情况下,一个明显的弱点是你为每个模板循环这个。如果一个模板恰好只有一个标签,那就太浪费了。

    我很想尝试对其进行更改,以便通过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);
    

    模板只包含两个占位符,我们只对它们采取行动,而不是循环遍历$transformations 中所有可能的标记替换。

    (请注意,我使用匿名函数作为preg_replace_callback() 的回调。如果您使用的是 PHP

    【讨论】:

    • 完美运行。接受,+1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多