Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coldfusion-结构和动态变量名称_Coldfusion_Structure_Coldfusion 11_Dynamic Variables - Fatal编程技术网

Coldfusion-结构和动态变量名称

Coldfusion-结构和动态变量名称,coldfusion,structure,coldfusion-11,dynamic-variables,Coldfusion,Structure,Coldfusion 11,Dynamic Variables,我在获取和处理包含动态变量名的结构时遇到问题。我有一个结构cfStruct,其中包含另一个结构。在最后一个结构中,项目最多为4个 这是我的电子邮件结构 EMAILS":{"1":"mail1@test.com","2":"mail2@test.net","3":"mail3@test.fr"} 我尝试为这个结构的每个项目创建一个变量,如果它存在的话。然而,它不起作用: <cfif IsDefined("cfStruct.EMAILS")> <cfloo

我在获取和处理包含动态变量名的结构时遇到问题。我有一个结构cfStruct,其中包含另一个结构。在最后一个结构中,项目最多为4个

这是我的电子邮件结构

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>

你能帮我解决这个问题吗


关于,

我解决了这个问题,这是一个语法问题:

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

严格来说,您应该使用cfStruct.EMAILS[“#i#”]而不是“#cfStruct.EMAILS[i]#”。就是

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

我认为最干净的是写以下内容:

<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解析字符串,计算其中的表达式,并返回一个新字符串来代替此字符串
  • 显式优于隐式,使用
    变量[“EMAIL#i#”]
    可以准确地告诉您将要创建的变量放置在何处,因此当您几个月后重新阅读时,会非常清楚发生了什么
奖金
如果将循环更改为
,那么代码将不会创建超过需要的变量(如果需要此效果),并且可以扩展到任意数量的结构值。

这如何?好的观点。“返回一个新字符串代替这个字符串”同意,使用引号是没有必要的,但我相信CF仍然会返回相同的字符串。除非你改变这个值,比如说。。。添加字符或使用串联。它确实会返回相同的值,但它会在插值例程期间生成额外的数据,这些数据需要进行垃圾收集,并将内存保留到那时。记住字符串在Java中是不可变的,所以无论何时更改或修改字符串,您都可能会使用超出必要的资源,并相信编译器会为您优化字符串操作。没错,但Java有字符串池。因为绳子没有改变,我想它会被从游泳池里拉出来。你有没有读过任何关于CF行为不同的文章?我很好奇CF是如何处理它的,但在这个主题上找不到任何明确的东西:)字符串没有改变,但创建的第一个字符串是“#I#”,作为一个文本,CF可以采取很多方法,但它们对如何处理没有太多的透明度。但我所知道的是,很长一段时间以来,lucee及其前身railo执行字符串插值的速度比cf快,并且尽可能使用串联技术构建字符串在cf上运行得更快。然而,这种差异仅在较大的数据集上才明显。正确的技术将允许编译器生成更优化的字节码,并且差异是可以测量的。是的,但是字符串文本通常是内部的。因此,在这种情况下,CF似乎更可能不会创建新字符串。不过,我可以肯定地看到串联是不同的,因为它可能会创建许多不同的字符串,这取决于它的实现方式。不管怎样,由于内部行为未知,因此在我看来,说“将返回一个新字符串”并不完全准确,因为我们不确定CF在引擎盖下的行为;-)尽管如此,我同意应该避免不必要的引用。