Установка параметра внутри строки массива - PullRequest
1 голос
/ 15 ноября 2011

У меня есть функция language($tag), для которой требуется файл lang.php, который содержит массив с именем $lang, который содержит некоторые параметры. В частности строка $lang['message']. Через несколько строк выполнения возвращается $lang['message'].

Массив $ lang определен следующим образом:

$lang[$tag] = array(
    'message' => 'This is a message',
    ...
);

Теперь предположим, что я хотел бы иметь возможность устанавливать параметры внутри $lang['message'], которые я должен иметь возможность определять в language($tag, $parameters). И эти параметры должны установить переменную внутри $lang['message'], такую ​​как:

$lang[$tag] = array(
    'message' => 'This is a '. $1,
    ...
);

Как наилучшим образом организовать language($tag, $parameters), чтобы в $parameters множествах $1 в $lang['message']?

Если вы не поняли, я бы хотел позвонить language($tag, 'post') и вернуть его 'This is a post'.

Ответы [ 3 ]

3 голосов
/ 15 ноября 2011

Как насчет сохранения строк в виде printf шаблонов, например,

$lang[$tag] = array(
    'message' => 'This is a %s'
);

Затем вы можете использовать vsprintf для передачи массива подстановок значений, например,

function language($tag, array $values)
{
    // get $lang from somewhere

    return vsprintf($lang[$tag]['message'], $values);
}
2 голосов
/ 15 ноября 2011

Я бы, вероятно, пошел с sprintf () для моей языковой функции.

Решение, вероятно, будет выглядеть так:

$lang = array(
    'stop' => 'Stop right there!',
    'message' => 'This is a %s',
    'double_message' => 'This is a %s with %s comments',
    ...
);

И:

function language()
{
    $lang = get_lang_from_file(); // You probably have the idea
    $params = func_get_args();


    if(count($params) == 1)
        return $lang[$params[0]];

    $params[0] = $lang[$params[0]];
    return call_user_func_array("sprintf", $params);
}

Таким образом, вы можете использовать его так:

echo language('stop'); // outputs 'Stop right there!'
echo language('message', 'message for you'); // outputs 'This is a message for you'
echo language('double_message', 'message for you', '6'); // outputs 'This is a message for you with 6 comments
2 голосов
/ 15 ноября 2011

Одним из решений может быть использование sprintf().

'message' => 'This is a %s',

И вы просто используете его следующим образом:

sprintf($lang['message'], 'post');

Пожалуйста, прочтите страницу руководства sprintf(), чтобы увидеть его многочисленные возможности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...