Построение динамической иерархической структуры

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