12

PHP で Python のように指定子に名前を付ける方法はありますか?

PHPでこれが欲しい:

$foo = array('name' => 24);
printf("%(name)d", $foo);

Googleまたはphpマニュアルに関連するものは何も見つかりませんでした。

4

4 に答える 4

11

いい質問です!

正規表現を使用することで、それほど問題なく独自のロールを作成できます。を呼び出すという考えに基づいて実装を行いました。これは、組み込み関数ファミリのvsprintf中で宣言された目標に最も近いものです。printf

function vsprintf_named($format, $args) {
    $names = preg_match_all('/%\((.*?)\)/', $format, $matches, PREG_SET_ORDER);

    $values = array();
    foreach($matches as $match) {
        $values[] = $args[$match[1]];
    }

    $format = preg_replace('/%\((.*?)\)/', '%', $format);
    return vsprintf($format, $values);
}

テストする:

$foo = array('age' => 5, 'name' => 'john');
echo vsprintf_named("%(name)s is %(age)02d", $foo);

更新:私の最初の実装は非常にラムダ式でした。非常に基本的なforeachもので十分であることが判明しました。これにより、関数は PHP >= 4.1 でも使用できるようになります (特定のバージョンについて 100% 確信があるわけではありませんが、そこにあるはずです)。

実際に見てください

于 2011-09-15T18:02:43.730 に答える
9

sprintf次のように、パラメーターに番号を付けることでそれを行うことができます。

echo sprintf('hello, %2$s. What is your %1$s', 'age', 'Jesse');


次の文字列を出力します。

こんにちは、ジェシー。あなたは何歳ですか

于 2011-09-15T17:54:16.460 に答える
9

使用strtr:

$foo = array('%name%' => 24);
strtr("%name%", $foo); // 24

これを行うこともできます

"${foo['name']}"

またはこれ:

$name = 24;
"$name"
于 2011-09-15T17:53:21.430 に答える
0

より近いコア機能はvsprintf()、複数のパラメーターの代わりに配列を使用することですが、それでも番号付きパラメーターを使用する必要があります。

この関数ドキュメントのコメントには、あなたが望むことを行う関数を作成した人がいますvnsprintf() printf+array+named parameters

于 2011-09-15T17:59:26.497 に答える