2011-11-15 32 views
4

我正在做一个博客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... 
+0

你VAR /本地作用域的变量? –

+0

我不是,但增加了变量范围的变量固定它。我诚恳地不承认如何修复它。 – Phil

+2

当你没有作用域时,ACF将它们中的每一个都放在共享变量的作用域中,因此该组件中的每个函数都访问相同的变量。所以当你循环调用更多的函数时,你的初始变量每次都被覆盖。当你使用var关键字时,它将它们放到'local'范围内,并且每个函数都有自己的本地范围,它只存在于该函数中。 –

回答

7

您没有显示完整的代码。

我怀疑代替你做了什么节目与任一将解决这个问题:

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


你应该总是兼用VAR关键字或局部作用域中的变量。

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

+0

getComments函数使用相同的结果变量返回数组。可能这个事实是,无标度变量导致无限递归。 – Phil

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

拳头交转储:柱结构,第二柱转储:柱结构+评论包含数组2个注释(结构),结果转储:无限嵌套阵列 - > struct.array->结构....的第一个元素,因为中止。 – Phil

+0

当你注释掉StructInsert(post,'comments'....)行时,你还会得到这种无限递归行为吗? –

+0

不,它工作正常,没有这一行,但我需要在帖子中包含评论。 getComments(post.postId)的转储会为每个帖子返回一个注释数组,像它应该那样。 – Phil