Coldfusion - 结构和动态变量名称

时间:2017-06-26 12:31:21

标签: coldfusion structure coldfusion-11 dynamic-variables

我在获取和处理包含动态变量名的结构时遇到问题。我有一个结构 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>

你能帮我解决一下这个问题吗?

此致

3 个答案:

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