2013-03-13 83 views
0

我顯示從客戶提供的記錄中提取的地址數據,並嘗試正確格式化。每個客戶都可以指定他們希望他們的客戶數據如何顯示,所以我爲每個使用php的sprintf()及其格式化功能的客戶端使用可編輯的基於JSON的模板。帶可選參數的Sprintf格式化

所以客戶端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()與所提供的格式效果很好寫它,並且不REQ請求我創建一個自定義格式化函數來處理各種地址格式。 的問題是,如果一個數據是空的,它就會顯示,即如果街道地址丟失,我們有:

Bill Smith 
, Whoville, OH 94301 

我想拿出不需要的解決方案重新發明輪子,但是可以向其他體系結構開放,這將使我能夠靈活處理具有相應靈活格式的「可選」數據。

回答

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()運行數據組件和連接格式字符串。不完美,但工作比以前更好,相當靈活。