动态变量命名和引用(ColdFusion)

7

大家好,祝愿周五愉快。

我已经尝试了几天,但仍然无法解决问题。我的目标是使用固定字符串和变量(数字)的组合动态创建一个变量。

我正在查询数据库以获取代理列表,然后我想为每个代理创建单独的变量来保存不同的统计数据。我希望将循环中的当前统计数据(例如,创建的工单)添加到每个代理的ID之后。

我称这个第一个统计数据为GC,表示Get Created,因此具有当前统计数据和代理ID的示例变量可能类似于GC1

我已经谷歌搜索并阅读了许多提示、指南等,但它们大多已过时(2002年!)或似乎基于查询和数组。我正在寻找更简单的方法(或者我认为应该如此)。

我知道我应该能够使用以下内容动态创建变量(其中AID代表代理ID):

<cfset "GC#AID#" = getCreated.RecordCount>

现在,我没有收到任何错误提示,所以我认为变量已经被正确创建了。但是,当我尝试输出这个变量时,我遇到了一个实际上(或者我认为会)成为问题的地方。
无论我尝试多少不同的方法,输出结果总是`GC1`。相反,我想要显示变量的,而不是变量名。
我知道我不想使用`evaluate`函数,我在其他网站和SO上看到了很多关于使用结构符号的示例,但这些都是与查询一起使用的。
我觉得我可能错过了非常简单的东西。您有什么想法吗?如何在没有查询上下文的情况下输出动态创建变量的
抱歉解释太长了,只是想确保我表达清楚。
如果需要任何澄清,请告诉我。
我正在使用ColdFusion 10,如果这有关的话。
先行致谢! 编辑1 这是我目前用于输出代码的内容:
<cfset test = "GC#variables.AID#">
Test: <cfoutput>#test#</cfoutput>

我意识到这可能离题了。


那么你的输出代码在哪里?那就是你遇到问题的代码,但你没有发布它。 - Jason Dean
@JasonDean 抱歉,已添加。 - Caleb Palmquist
请看我下面的答案,我认为它会回答你的问题。在你上面的例子中,你将值GC1分配给变量test。当你输出#test#时,你还能期望其他的输出吗? - Jason Dean
如果你将<cfoutput>的内容更改为variables[test]或evaluate(test),你的代码就可以工作了。我不建议使用evaluate()。 - Jason Dean
不是答案,但是动态变量的需求背后是什么?通常,使用结构体是一种更容易通过键(如ID)管理/查找多个对象的方法。 - Leigh
2个回答

18

一种选项:

设置动态变量名:

<cfset variables["GC" & AID] = "Testing" />

输出动态变量名称的值:

<cfoutput>#variables["GC" & AID]#</cfoutput>

另一种选择:

设置动态变量名:

<cfset variables["GC#AID#"] = "Testing" />

输出动态变量名的值:

<cfoutput>#variables["GC#AID#"]#</cfoutput>

1
非常感谢你,Jason。非常易懂,而且完美运行! - Caleb Palmquist

1
所有的变量作用域都是结构体。因此,通过结构体循环遍历该作用域。根据你的代码编写方式,它在变量作用域内。我会将其放在自己的结构体中,但这是你尝试做的东西的一个折衷版本。
<cfloop collection="#variables#" item="k">

    <cfif left(k,2) eq "GC">
        <cfoutput>#k# : #variables[k]#</cfoutput><br/>
    </cfif>

</cfloop>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接