我正在尝试编写一些代码,这些代码将循环通过以'layer'开头的URL参数,然后是1,2,3等。例如:
http://example.cfm?numLayers=2&layer1=somevalue,123&layer2=someothervalue,456
每次URL中的图层数都不同。
这是我的代码:
<cfif isDefined("url.numLayers") AND url.numLayers gt 0>
<cfset session.structLayers = structNew() />
<cfloop index="index" from="1" to="#url.numCustom#">
<cfset layerElement = evaluate(url.layer#index#) /><!--- This is where I'm having trouble --->
<cfset arrLayerElement = listToArray(layerElement)>
<structInsert(session.structLayers, arrLayerElement[1], arrLayerElement[2])]>
</cfloop>
</cfif>
我在上面标记的行上收到“无效的CFML构造错误”。我做得不对。
答案 0 :(得分:4)
您可以尝试以下内容。首先,使用structKeyExists()
而不是isDefined()
。你会看到更好的表现:
<cfset numLayers = 0 />
<cfif structKeyExists(url, "numLayers")>
<cfset numLayers = val(url.numLayers) />
</cfif>
此外,您不再需要使用evaluate()
。
<cfset session.structLayers = {} /> <!--- instead of "structNew()" --->
<cfloop from="1" to="#numLayers#" index="ii">
<cfif structKeyExists(url, "layer#ii#")> <!--- instead of evaluate --->
<cfset arrLayerElement = listToArray(url["layer#ii#"]) />
<cfset structInsert(session.structLayers, arrLayerElement[1], arrLayerElement[2]) />
</cfif>
</cfloop>
您也可以这样做:
<cfloop collection="#url#" item="mylayer">
<cfif REFindNoCase("^layer\d+$", mylayer) AND listLen(url.mylayer) EQ 2>
<cfset structInsert(session.structLayers, listFirst(url.mylayer), listLast(url.mylayer) />
</cfif>
</cfloop>
我意识到在编写这段代码时,并不真正需要调用listToArray()
。如果你打算在循环之外再次使用数组,那么我会全力以赴,但由于你曾经使用它一次然后再也没有再引用它,它可能不值得这么麻烦。
答案 1 :(得分:1)
您可以使用数组访问器语法(方括号)来处理结构中的动态键:
<cfif structKeyExists(url,"numLayers") AND url.numLayers gt 0>
<cfset session.structLayers = {} />
<cfloop index="index" from="1" to="#url.numCustom#">
<!--- use this instead of evaluate to get dynamic keys out of a struct --->
<cfset var layerElement = url["layer#index#"] />
<!--- same way to set a dynamic key into a struct --->
<cfset session.structLayers[listFirst(layerElement)] = listLast(layerElement) />
</cfloop>
</cfif>
答案 2 :(得分:1)
您可以尝试这个简单的代码。只需用您自己的struct替换session_struct即可。您可以附加此URL以进行测试:
?numLayers=5&layer1=Layer1Key,Layer1Value&layer2=Layer2Key,Layer2Value
<cfif StructKeyExists(url, "numLayers") and url.numLayers gt 0>
<cfloop list="#StructKeyList(url)#" index="key">
<cfif ReFindNoCase("^layer", key)>
<cfset StructInsert(session_struct, ListGetAt(url[key], 1), ListGetAt(url[key], 2))>
</cfif>
</cfloop>
</cfif>
<cfdump var="#session_struct#">