#struct #structure #coldfusion-9
#структура #coldfusion-9
Вопрос:
У меня есть запрос, который возвращает строки в следующем формате:
ID NAME PARENTID
1 Top level. 0
7 Second level1. 1
10 Third Level under Second Level1. 7
22 Second Level2. 1
23 Third Level1 under Second Level2. 22
24 Third level2 under Second Level2. 22
Что я хочу сделать, так это динамически создавать структуру. Вышеуказанные данные необходимо было бы организовать в следующей иерархии:
Top Level.
Second Level1.
Third Level under Second Level1.
Second Level2.
Third Level under Second Level2.
Third Level under Second Level2.
Данные могут быть любыми, и глубина иерархии не ограничена. Я ищу программный способ организации этих данных в структуру независимо от того, что возвращается из запроса. Я пишу это в ColdFusion, поэтому, если у вас есть примеры CF, которые были бы хороши, но псевдокод был бы в порядке. Спасибо за помощь.
Ответ №1:
Вызовите эту функцию и передайте 0 в качестве родительского идентификатора и результата запроса для q_query.
<cffunction name="generateArray" returntype="Array">
<cfargument name="parentID" type="Numeric" required="yes" default=0 >
<cfargument name="q_query" type="query" required="yes">
<cfquery name="getChildren" dbtype="query">
SELECT *
FROM q_query
WHERE parentid = <cfqueryparam value="#parentID#" cfsqltype="CF_SQL_INTEGER">
ORDER BY sequence;
</cfquery>
<cfset treeArray = ArrayNew(1)>
<cfloop query="getChildren">
<cfquery name="checkForChildren" dbtype="query">
SELECT *
FROM q_query
WHERE parentid = <cfqueryparam value="#getChildren.id#" cfsqltype="CF_SQL_INTEGER">
</cfquery>
<cfset treeStruct = structNew()>
<cfset treeStruct["id"] = getChildren.id>
<cfset treeStruct["name"] = getChildren.name>
<cfset treeStruct["children"] = ArrayNew(1)>
<cfif checkForChildren.recordcount gt 0>
<cfinvoke component="cfcs.thisCfc" method="GenerateArray" parentID="#Val(getChildren.ID)#" q_query="#q_query#" returnvariable="children">
<cfset treeStruct["children"] = children>
</cfif>
<cfset temp = ArrayAppend(treeArray, treeStruct)>
</cfloop>
<cfreturn treeArray>
</cffunction>