2016-06-06 93 views
2

自從我編寫了這種類型的ColdFusion代碼以來就已經有一段時間了,因此也就成了問題。將名稱值對轉換爲struct

我將.NET webservice的值返回到ColdFusion中。 webservice返回一個字符串數組。下面的代碼...

<cfoutput> 
<cfset xArrayItems=#GetRequestedUserSettings.settingValues.getString()#> 
<cfset xLen=ArrayLen(GetRequestedUserSettings.settingValues.getString())> 
<cfloop index="x" from=1 to="#xLen#"> 
    #xArrayItems[x]#<br /> 
</cfloop> 
</cfoutput> 

結果如下輸出...

maxsize=50 
isdomainadmin=False 
seenwelcome=False 

我想把這些名稱/值對成有意義的結構,使我可以引用它們進一步向下代碼。我實際上需要將它們作爲下一個web服務調用的參數傳遞給它們。

請問有人能夠提醒我如何在CF8中做到這一點?我發現的大多數是指更新的版本。

+2

提示:把他們當作一個「清單」,用「=」號分隔。然後使用列表函數來提取第一個和第二個元素(即參數名稱和值)。 – Leigh

+1

當然在現有的循環內。 –

+0

謝謝你們。得到了果汁的流動和解決。 –

回答

7

我最終得到了和你提供的@Henry很相似的東西。

<cfset UserSettings = structNew()> 
    <cfset xArrayItems= GetRequestedUserSettings.settingValues.getString()> 
    <cfset xLen=ArrayLen(GetRequestedUserSettings.settingValues.getString())> 
    <cfloop index="x" from=1 to="#xLen#"> 
     <cfset varName = ListGetAt(xArrayItems[x], 1, "=")> 
     <cfset varValue = ListGetAt(xArrayItems[x], 2, "=")> 
     <cfset "UserSettings.#varname#" = varValue> 
    </cfloop> 

不確定數組或結構是否是更好的解決方案,但兩者都在最後工作。

+2

幹得好。一些提示:a)您還可以使用關聯數組表示法來設置值,即''和b)大多數列表函數忽略空元素。如果元素可以是空的,或者驗證'listLen()'是> = 2或者使用'getToken()',如果元素不存在則不會拋出錯誤。 – Leigh

+1

我會用CFScript和for-in做循環 –

+1

同意。不幸的是,它們看起來像是在使用CF8。 IIRC,直到9.0.1才加入for-in數組循環支持。 – Leigh

1

稍微更可讀的版本,我可以想出將與CF8工作:

<cfset UserSettings = {}> 
<cfset xArrayItems = GetRequestedUserSettings.settingValues.getString()> 
<cfloop array="#xArrayItems#" index="item"> 
    <cfset varname = ListFirst(item, "=")> 
    <cfset varvalue = ListRest(item, "=")> 
    <cfset UserSettings[varname] = varvalue> 
</cfloop>