2016-06-06 5 views
2

Прошло некоторое время с тех пор, как я написал этот тип кода ColdFusion, следовательно, вопрос.Преобразуйте пары значений имени в структуру

Я возвращаю значения из .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 

Я хочу, чтобы поставить эти пары имя/значение в осмысленную структуру, так что я могу ссылаться на них дальше вниз код. Мне действительно нужно передать их как cfinvokearguments для следующего вызова webservice.

Может кто-нибудь, пожалуйста, будьте любезны, чтобы напомнить мне, как это сделать в 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> 

Не уверен, что Array или Struct - лучшее решение, но оба работают в конце.

+2

Хорошая работа. Несколько советов: а) Вы можете также использовать ассоциативную нотацию массива для установки значений, то есть '' и b) Большинство функций списка игнорируют пустые элементы. Если элементы могут быть пустыми, либо проверяйте 'listLen()' is> = 2 ИЛИ используйте 'getToken()', который не выдает ошибку, если элемент не существует. – Leigh

+1

Я бы использовал CFScript и для ввода в цикл –

+1

Согласовано. К сожалению, похоже, что они используют CF8. Поддержка IIRC, поддержка встроенного массива не была добавлена ​​до 9.0.1. – 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> 

 Смежные вопросы

  • Нет связанных вопросов^_^