在作为数组的ColdFusion结构中创建密钥的正确语法是什么?最好是在cfscript标签中。
为了更清楚地了解我正在尝试做什么,这就是我的想法:
StructInsert(account[i], "child[numChildren]", z);
其中“child”应该是一个数组,numChildren是一个循环中的计数器。
显然这不起作用。它只是给我一个错误,说关键字“child [numChildren]”已经存在。
答案 0 :(得分:8)
你说的“帐户”结构称为“子”,它是一个数组。这没有任何意义。如果“child”是一个数组,则它不能是一个结构。如果它是一个结构,它不能是一个数组。数组可以包含结构,结构可以包含数组。
struct是一个map或hash,换句话说,它由名称值对组成。数组是值的集合或列表。您可以循环它们,或通过它们的数字索引访问它们。
让我们考虑一个结构,子进行数组。
<cfset Account = structNew() />
<cfset Account.Child = ArrayNew(1) />
Account是一个结构体,因此您可以在其上使用结构函数(structKeyExists,structInsert) Account.Child是一个数组,因此您可以在其上使用数组函数(arrayAppend等)。作为数组的Account.Child可以包含条目中的几乎任何值,包括复杂值。所以让我们让Account.Child成为一个结构数组。
让我们假设你的例子中的z是一个看起来像这样的结构:
<cfset z = structNew() />
<cfset z.id = 1 />
<cfset z.name = "James" />
你可以像这样添加到Account.Child:
<cfset ArrayAppend(account.child,z) />
或者,您可以通过索引直接执行此操作:
<cfset account.child[numChildren] = z />
现在。假设您希望将Account保留为结构,但是您希望结构中的每个子项都有1个键,而不是使用数组。您可以使用动态密钥来完成此操作,如下所示:
<cfset Account["child_#numChildren#"] = z />
仅供参考,structInsert通常是一个不必要的函数。
答案 1 :(得分:1)
如果您想要变量,请删除引号,否则键是该字符串。
虽然很难确定你想说的是:
Account[i][ child[numChildren] ] = z
VS
Account[i]['child'][numChildren] = z
或其他。
<强>更新强>
好的,基于你的评论,你可能想要这个:
Account.Child[numChildren] = z;
这将在numChildren作为索引的循环中,在以下语句之后的某个地方:
Account = StructNew();
Account.Child = ArrayNew(1);
(您也可以使用Account['Child']
代替Account.Child
表示法。)
答案 2 :(得分:1)
我并不完全清楚你想要做什么 - 但是如果你想在结构中创建一个子元素,这是你要做的:
var s = StructNew();
StructInsert(a, "ArrayName", ArrayNew(1))
a.ArrayName[10] = "Value for index 10";
StructInsert采用以下参数:(struct,key,value)。有关详细信息,请参阅此Adobe文档:http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-7f02.html