与可选参数类似的Sprintf格式

时间:2013-03-13 16:41:07

标签: php printf

我正在显示从客户提供的记录中提取的地址数据,并尝试正确格式化。每个客户端都可以指定他们希望客户数据显示的方式,因此我为每个使用php sprintf()及其格式化功能的客户端使用可编辑的基于JSON的模板。

所以客户A希望他们的地址显示如下:

Bill Smith
123 Fake St
Whoville, OH

保存的格式为%s<br>%s<br>%s, %s

客户B希望:

Bill Smith
123 Fake St, Whoville, OH 94301

保存格式为%s<br>%s, %s, %s %s

然后我将这些格式存储在一个特定于客户端的模板中,该模板告诉我要从哪个字段中提取和格式,即:

{
    "fields": [
        "full_name",
        "street",
        "city",
        "state",
        "zip"
    ],
    "format": "%s<br>%s, %s, %s %s"
}

解码JSON,提取数据并使用提供的格式使用sprintf()编写数据效果很好,并且不需要我创建自定义格式化函数来处理各种地址格式。 问题是,如果一个数据是空的,它会显示,即如果街道地址丢失,我们有:

Bill Smith
, Whoville, OH 94301

我正在尝试提出一个不需要重新发明轮子的解决方案,但我对其他架构开放,这将使我能够灵活地处理“可选”数据并具有相应的灵活格式。

1 个答案:

答案 0 :(得分:1)

基于this answer,我发现并实施了一个运行良好的解决方案。

基本上,我正在分解格式化组件并将它们与数据组件匹配,因此我有类似的东西:

{
  "data": "Bill Smith",
  "format": "%s"
},
{
  "data": "123 Fake St",
  "format": "<br>%s,"
},
{
  "data": "Whoville",
  "format": " %s,"
},
{
  "data": "OH",
  "format": " %s"
}

当我浏览上面的组件时,然后检查.data中的值,如果找到,则将格式组件连接到格式变量。最后,我通过vsprintf()运行数据组件和连接格式字符串。不完美,但工作比以前更好,相当灵活。