2011-11-15 159 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