printf() 字符串中的名称 PHP 说明符

发布于 2024-12-04 23:02:19 字数 184 浏览 2 评论 0原文

PHP 中有没有一种方法可以像 Python 一样命名我的说明符?

我想在 PHP 中使用这个:

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

我在 google 或 php 手册中找不到任何相关内容。

Is there a way in PHP to name my specifiers like in Python?

I want this in PHP:

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

I couldn't find nothing related on google or in the php manual.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

娇妻 2024-12-11 23:02:19

好问题!

通过使用正则表达式,您可以轻松地推出自己的产品。我的实现基于调用 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);

更新: 我最初的实现非常适合 lambda。事实证明,一个超级基本的 foreach 就足够了,这也使得该函数可以在 PHP >= 4.1 中使用(不能 100% 确定特定版本,但应该在那里)。

查看实际操作

Nice question!

You can roll your own without too much trouble by working with regexes. I based the implementation on the idea of calling vsprintf, which is closest to the stated goal among the built-in printf family of functions:

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);
}

To test:

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

Update: My initial implementation was very lambda-happy. Turns out a super basic foreach will suffice, which also makes the function usable in PHP >= 4.1 (not 100% sure about the specific version, but should be around there).

See it in action.

撞了怀 2024-12-11 23:02:19

使用strtr

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

您也可以这样做

"${foo['name']}"

或者这样:

$name = 24;
"$name"

Use strtr:

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

You could also do this:

"${foo['name']}"

Or this:

$name = 24;
"$name"
岁月蹉跎了容颜 2024-12-11 23:02:19

您可以使用 sprintf 通过对参数进行编号来完成此操作,如下所示:

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

输出以下字符串:

你好,杰西。你的年龄是多少岁

You can do it with sprintf by numbering the parameters, like so:

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

Outputs the following string:

hello, Jesse. What is your age

漫雪独思 2024-12-11 23:02:19

更接近的核心函数是 vsprintf() 使用数组而不是多个参数,但您仍然必须使用编号参数。

在此函数文档的注释中,有人创建了一个函数来执行您想要的操作 vnsprintf() printf+数组+命名参数

the closer core function is vsprintf() to use an array instead of multiple parameter, but you still have to use numbered parameters.

in the comments of this function docs there is someone who created a function to do what you want vnsprintf() printf+array+named parameters

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文