创建结构数组的问题

时间:2011-11-15 18:12:40

标签: coldfusion multidimensional-array

我正在创建一个博客API,并且在尝试在coldfusion中创建一个结构数组时遇到一些非常奇怪的问题。顶级数组将包含作为结构的帖子,其中.comments是该帖子下所有注释的数组,也是结构。

以下代码中的每个部分都单独工作。但是,不知何故,当我把它们放在一起时,我最终会得到一个无限嵌套的结构数组,其中包含一个结构数组等...所有这些只是顶级数组帖子中的最后一个元素。

<cfset posts = VARIABLES.postDao.getBlogPosts(argumentCollection=arguments) />
<cfset result = arraynew(1) />

<cfloop index="i" from="1" to="#arrayLen(posts)#">
  <cfset post = posts[i].getInstance()>
  <cfset StructInsert(post, 'comments', getComments(post.postId))>
  <cfset ArrayAppend(result, post)>
</cfloop>

getBlogPosts返回一个Post bean数组 bean.getInstance()返回一个包含bean中所有数据的结构 getComments(id)返回一个数组post [id]的所有注释(结构)。

这些中的每一个都按预期工作,并在其他地方使用而没有任何问题。

无限嵌套数组的结构如下:

Array containing Post  
.  Post.comments containing array of comments + Post on end  
.  .  Post.comments containing array of comments + Post on end
.  .  . etc...

2 个答案:

答案 0 :(得分:8)

您没有显示整个代码。

我怀疑用这些中的任何一个替换你所做的就会解决问题:

<cfset local.posts = VARIABLES.postDao.getBlogPosts(argumentCollection=arguments) />
<cfset local.result = arraynew(1) />

<cfloop index="local.i" from="1" to="#arrayLen(local.posts)#">
    <cfset local.post = local.posts[local.i].getInstance()>
    <cfset StructInsert(local.post, 'comments', getComments(local.post.postId))>
    <cfset ArrayAppend(local.result, local.post)>
</cfloop>


或者:

<cfset var posts = VARIABLES.postDao.getBlogPosts(argumentCollection=arguments) />
<cfset var result = arraynew(1) />
<cfset var i = 0 />
<cfset var post = 0 />

<cfloop index="i" from="1" to="#arrayLen(posts)#">
    <cfset post = posts[i].getInstance()>
    <cfset StructInsert(post, 'comments', getComments(post.postId))>
    <cfset ArrayAppend(result, post)>
</cfloop>


您应该 始终 对cffunction中的变量使用var关键字或局部范围。

您可以使用VarScoper检查您需要修复的其他地方的代码。

答案 1 :(得分:0)

请尝试在其中添加一些cfdumps并报告您的内容:

<cfset posts = VARIABLES.postDao.getBlogPosts(argumentCollection=arguments) />
<cfset result = arraynew(1) />

<cfloop index="i" from="1" to="#arrayLen(posts)#">
  <cfset post = posts[i].getInstance()>
  <cfdump var="#post#">
  <cfset StructInsert(post, 'comments', getComments(post.postId))>
  <cfdump var="#post#">
  <cfset ArrayAppend(result, post)>
  <cfdump var="#result#"><cfabort>
</cfloop>

修改

我认为问题是对父值的子引用,它在递归对象时产生无限循环。尝试改为:

<cfset posts = VARIABLES.postDao.getBlogPosts(argumentCollection=arguments) />
<cfset result = arraynew(1) />

<cfloop index="i" from="1" to="#arrayLen(posts)#">
  <cfset post = posts[i].getInstance()>
  <cfset StructInsert(post, 'comments', Duplicate(getComments(post.postId)))>
  <cfset ArrayAppend(result, post)>
</cfloop>