2011-11-15 3 views
4

블로그 API를 만들고 있고 Coldfusion에서 구조체 배열을 만들려고 할 때 매우 이상한 문제가 있습니다. 최상위 배열에는 구조체로 게시물이 포함되며 해당 게시물 아래에있는 모든 주석의 배열 인 struct .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의 모든 데이터가있는 struct를 반환합니다.
getComments (id)는 post [id]에 대한 모든 주석 (structs) 배열을 반환합니다.

이들 각각은 의도 한대로 작동하며 문제없이 다른 곳에서 사용됩니다.

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

var/local 범위를 지정 했습니까? –

+0

나는 아니었지만 변수에 변수 범위 지정을 추가하여 변수를 고정했습니다. 나는 그것을 정정하는 방법을 정직하게 생각하지 않습니다. – Phil

+2

범위를 지정하지 않으면 ACF는 각 변수를 공유'variables' 범위에 넣습니다. 따라서 해당 구성 요소의 모든 함수는 동일한 변수에 액세스합니다. 따라서 더 많은 함수를 호출하여 반복 할 때마다 초기 변수가 매번 덮어 쓰여집니다. 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> 


또는 : 당신이해야 항상 사용 중 VAR

<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의 변수에 대한 키워드 또는 로컬 범위.

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-> struct .... 첫 번째 요소, 중단 때문에. – Phil

+0

StructInsert (post, 'comments'....) 행을 주석 처리 할 때 여전히이 무한 재귀 동작이 발생합니까? –

+0

아니, 그 줄없이 잘 작동하지만 게시물에 댓글을 포함해야합니다. getComments (post.postId) 덤프는 각 게시물에 대한 주석 배열을 반환해야합니다. – Phil