PHP 用 vars 替换字符串中的通配符(%s、%d)

Ing*_*dak 1 php

我有翻译功能t($var);

function t($word) {
    return $this->words[$word];
}
Run Code Online (Sandbox Code Playgroud)

$this->words数组在哪里

$this->words = array(
    'word1' => 'word',
    'word2' => 'something'
);
Run Code Online (Sandbox Code Playgroud)

我使用函数为<?php echo t('word1'); ?> ,输出为:word

我的目标是使用通配符%s%d%f将它们替换为变量。

例子:

$this->words = array(
    'word1' => 'word',
    'word2' => 'something',
    'sentence' => 'Hello, my name is %s. I am %d years old.'
);
Run Code Online (Sandbox Code Playgroud)

然后将变量解析为t()函数。

<?php echo t('sentence', array('Mike', 99));
Run Code Online (Sandbox Code Playgroud)

所以输出将是:Hello, my name is Mike. I am 99 years old.

到目前为止我的工作:

function t($word, $vars = array()) {
    foreach ($vars as $key) {
        if(is_string($key)){
            $this->words[$word] = str_replace ('%s', $key, $this->words[$word]);
        }
        if(is_int($key)) {
            $this->words[$word] = str_replace ('%d', $key, $this->words[$word]);
        }
        if(is_float($key)){
            $this->words[$word] = str_replace ('%f', $key, $this->words[$word]);
        }
    }
    return $this->words[$word];
}
Run Code Online (Sandbox Code Playgroud)

但此函数不适用于每种类型的多个变量。

小智 5

我见过人们推荐使用sprintf,但我个人建议使用vsprintfhttp://www.php.net/manual/en/function.vsprintf.php

function t($word, $vars = array()) {
  return vsprintf($this->words[$word], $vars);
}
Run Code Online (Sandbox Code Playgroud)

这允许您传递变量数组,而不是将它们作为单独的参数传递。

一般来说,翻译函数会首先检查翻译,如果没有找到,则返回查找键。

function t($word, $vars = array()) {
  return isset($this->words[$word]) ? vsprintf($this->words[$word], $vars) : $word;
}
Run Code Online (Sandbox Code Playgroud)