动态循环URL参数

时间:2015-04-03 17:29:03

标签: coldfusion

我正在尝试编写一些代码,这些代码将循环通过以'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构造错误”。我做得不对。

3 个答案:

答案 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#">