【问题标题】:Replace placeholders in array with values from other array用其他数组中的值替换数组中的占位符
【发布时间】:2013-07-30 13:26:43
【问题描述】:
我有 2 个数组,其中一个带有占位符,它们是另一个数组中的键
arr1 = array(
"id" => "{{verticalId}}",
"itemPath" => "{{verticalId}}/{{pathId}}/");
arr2 = array(
"verticalId" => "value1",
"pathId" => "value2");
那么我如何在 arr1 上运行并将占位符替换为来自 arr2 的值?
【问题讨论】:
标签:
php
regex
arrays
placeholder
【解决方案1】:
foreach ($arr1 as $key => &$value) {
$value = preg_replace_callback('/\{\{(.*?)\}\}/', function($match) use ($arr2) {
return $arr2[$match[1]];
}, $value);
}
【解决方案2】:
当然,这是一种方法。不过它需要一点爱,还有 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
);
【解决方案3】:
-
在@Barmar 的答案中循环目标数组不是(也不是在 2013 年)。数组可以作为preg_replace_callback() 函数的$subject。
-
您可以从 PHP 7.4 开始使用自动访问父作用域的箭头函数形式。
-
您不需要转义模式中的大括号。仅当括号内容是精确数字时,最后一个左括号才需要转义,例如 {\{300}}
-
我一般不建议在正则表达式中使用.*,但我会想出一个规则,即{{ }} 中的字符只能是\w+
最新答案:
$arr1 = preg_replace('/{{\w+}}/', fn($m) => $arr2[$m[1]], $arr1);