PHP关联数组值替换字符串变量

4

我有一个字符串:

$string = "My name is {name}. I live in {detail.country} and age is {detail.age}";

我有一个数组,它的格式始终是这样的。

$array = array(
   'name' => 'Jon',
   'detail' => array(
     'country' => 'India',
     'age' => '25'
  )
);

预期输出应该如下:

我的名字是Jon。我住在印度,年龄为25岁。

到目前为止,我尝试了以下方法:

$string = str_replace(array('{name}','{detail.country}','{detail.age}'), array($array['name'],$array['detail']['country'],$array['detail']['age']));

但问题在于我们不能使用字符串变量的纯文本。它应该基于数组键动态生成。

你可以考虑使用 Twig - Alex Howansky
4个回答

3

您可以使用preg_replace_callback()进行动态替换:

$string = preg_replace_callback('/{([\w.]+)}/', function($matches) use ($array) {
    $keys = explode('.', $matches[1]);
    $replacement = '';

    if (sizeof($keys) === 1) {
        $replacement = $array[$keys[0]];
    } else {
        $replacement = $array;

        foreach ($keys as $key) {
            $replacement = $replacement[$key];
        }
    }

    return $replacement;
}, $string);

还有一个preg_replace()的函数,但上述函数允许进行匹配处理。


2
你可以使用foreach来实现这个功能:

你可以使用foreach循环来实现:

foreach($array as $key=>$value)
{
  if(is_array($value))
  {
      foreach($value as $key2=>$value2)
      {
           $string = str_replace("{".$key.".".$key2."}",$value2,$string); 
      }
  }else{
      $string = str_replace("{".$key."}",$value,$string);
  }
}
print_r($string);

如果你的数组深度只有2层,上面的方法可以起作用,但如果你想要更加动态的效果,你将不得不使用递归。

原始答案:Original Answer


2
这是一个递归数组处理程序:http://phpfiddle.org/main/code/e7ze-p2ap。"Original Answer"的翻译是"最初的回答"。
<?php

function replaceArray($oldArray, $newArray = [], $theKey = null) {
    foreach($oldArray as $key => $value) {
        if(is_array($value)) {
            $newArray = array_merge($newArray, replaceArray($value, $newArray, $key));
        } else {
            if(!is_null($theKey)) $key = $theKey . "." . $key;
            $newArray["{" . $key . "}"] = $value;
        }
    }
    return $newArray;
}

$array = [
   'name' => 'Jon',
   'detail' => [
     'country' => 'India',
     'age' => '25'
  ]
];
$string = "My name is {name}. I live in {detail.country} and age is {detail.age}";

$array = replaceArray($array);

echo str_replace(array_keys($array), array_values($array), $string);

?>

-3

echo "我的名字是".$array['name']."。我住在".$array['detail']['countery'].",我今年".$array['detail']['age']."岁";


1
不是很动态。 - Anuga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接