2015-04-03 48 views
4

我试图写一些代码将通过URL参数循环以单词“层”,然后1,2,3等。例如开始:通过URL动态环参数

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结构错误”。我没有这样做。

+1

首先,如下所述评价是不必要的。这也是不安全的,所以应尽可能避免。也就是说,你正在使用evaluate()不正确。如果您阅读[文档](http://help.adobe.com/zh_CN/ColdFusion/10.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7f4d.html),则需要包含要评估的表达式的*字符串*。如果要抓取名为url.layer1的变量的值,则需要传入* string *“url.layer1”。您的代码没有传入正确的字符串。 – Leigh 2015-04-03 17:57:25

+0

您的示例显示layer1等于由somevalue和123组成的列表。是您的意图还是仅仅输入了错误?另外,为什么你需要一个结构?你已经有一个列表,cgi.querystring和你的所有数据。 – 2015-04-03 18:30:34

回答

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

您可以使用数组访问语法(方括号中)的结构与动态密钥的工作:

<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> 
1

你可以试试这个简单的代码。只需将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#">