我在获取和处理包含动态变量名的结构时遇到问题。我有一个结构 cfStruct ,其中包含另一个结构 EMAILS 。在最后一个结构中,项目的最大值为4
这是我的EMAILS结构
EMAILS":{"1":"mail1@test.com","2":"mail2@test.net","3":"mail3@test.fr"}
如果它存在的话,我尝试为这个结构的每个项创建一个变量。然而它不起作用:
<cfif IsDefined("cfStruct.EMAILS")>
<cfloop from="1" to="5" index="i">
<cfif StructKeyExists( cfStruct.EMAILS, '#i#' ) >
<cfset setVariable( "EMAIL_#i#", "#cfStruct.EMAILS.i#" >
<cfelse>
<cfset setVariable( "EMAIL_#i#", '') >
</cfif>
</cfloop>
<cfelse>
你能帮我解决一下这个问题吗?
此致
答案 0 :(得分:1)
我认为最干净的是这样写:
<cfloop from="1" to="5" index="i">
<cfif StructKeyExists( cfStruct.EMAILS, i ) >
<cfset variables["EMAIL_#i#"] = cfStruct.EMAILS[i] >
<cfelse>
<cfset variables["EMAIL_#i#"] = '' >
</cfif>
</cfloop>
由于以下原因:
'#i#'
时,您都在告诉CF解析字符串,评估其中的表达式并返回一个新字符串来代替该字符串。variables["EMAIL_#i#"]
可以准确地告诉您将要创建的变量放在何处,因此几个月后重新阅读时,可以清楚地知道发生了什么。如果将循环更改为<cfloop from="1" to="#structCount(cfStruct.EMAILS)#" index="i">
,则您的代码将不会创建超出所需数量的变量(如果需要此效果),并且可以扩展到任意数量的结构值。
答案 1 :(得分:0)
我解决了这个问题,这是一个语法问题:
<cfloop from="1" to="5" index="i">
<cfif StructKeyExists( cfStruct.EMAILS, '#i#' ) >
<cfset setVariable( "EMAIL_#i#", "#cfStruct.EMAILS[i]#") >
<cfelse>
<cfset setVariable( "EMAIL_#i#", '') >
</cfif>
</cfloop>
答案 2 :(得分:0)
严格来说,您应该使用cfStruct.EMAILS [&#34; #i#&#34;]而不是&#34;#cfStruct.EMAILS [i]#&#34;。也就是说,
<cfloop from="1" to="5" index="i">
<cfif StructKeyExists( cfStruct.EMAILS, "#i#" ) >
<cfset setVariable( "EMAIL_#i#", cfStruct.EMAILS["#i#"]) >
<cfelse>
<cfset setVariable( "EMAIL_#i#", '') >
</cfif>
</cfloop>