将数组中的占位符替换为其他数组中的值


Replace placeholders in array with values from other array

我有两个数组,其中一个带有占位符,它们是另一个数组中的键

arr1 = array(
    "id"       => "{{verticalId}}",
    "itemPath" => "{{verticalId}}/{{pathId}}/");
arr2 = array(
        "verticalId" => "value1",
        "pathId"     => "value2");

那么,我如何在arr1上运行并用arr2中的值替换占位符呢?

foreach ($arr1 as $key => &$value) {
    $value = preg_replace_callback('/'{'{(.*?)'}'}/', function($match) use ($arr2) {
        return $arr2[$match[1]];
    }, $value);
}

当然,这里有一种方法。不过它需要一点爱,还有PHP 5.3+

<?php
$subject = array(
    'id' => '{{product-id}}'
);
$values = array(
    'product-id' => 1
);
array_walk($subject, function( & $item) use ($values) {
    foreach($values as $template => $value) {
        $item = str_replace(
            sprintf('{{%s}}', $template),
            $value,
            $item
        );
    }
});
var_dump(
    $subject
);
  • 在@Barmar的回答中,没有必要(2013年也没有)循环目标数组。允许将数组作为preg_replace_callback()函数的$subject。

  • 从PHP 7.4开始,您可以使用箭头函数表单,该表单可以自动访问父作用域。

  • 您不需要转义模式中的花括号。如果括号内容是一个精确的数字,如{'{300}} ,则只需要转义最后一个左括号

  • 我通常不建议在正则表达式中使用.*,但我只会提出一个规则,即{{ }}中的字符只能是'w+

最新答案:

$arr1 = preg_replace('/{{'w+}}/', fn($m) => $arr2[$m[1]], $arr1);