如何动态循环遍历结构数组

use*_*633 2 coldfusion coldfusion-9

我需要从结构数组中创建一个查询对象.该阵列有大约200个键,阵列内部的结构在名称,大小和深度上有所不同.这是一个节点的样子:

我需要循环并创建查询对象的结构数组

我已经让它适用于数组[#i] .adGroupId和数组[#i#].userStatus但我需要在将结构值添加到查询之前检查它是否存在.criterion.text例如并不总是在结构中,所以我需要检查,但不知道如何.这是迄今为止的代码,但它总是跳过criterion.text和bids.maxCpc.amount.microAmount.

<cfset vColumns = "AdGroupID,KeywordText,Status,MaxCPC" />
<cfset vColumnValue = "AdGroupID,criterion.text,userStatus,bids.maxCPC" />
<cfset loopnum = 1>
<cfset myquery = QueryNew(vColumns) >
<cfloop array="#aKeywordsAll#" index="i">
    <cfset temp = QueryAddRow(myquery, 1)>
    <cfset loopNum2 = 1>
    <cfloop list="#vColumnValue#" index="j">                
        <cfif structKeyExists(aKeywordsAll[loopnum],j)>
            <cfset QuerySetCell(myquery, listGetAt(vColumns, loopNum2), aKeywordsAll[loopnum][j])>
        <cfelse>
            <cfset QuerySetCell(myquery, listGetAt(vColumns, loopNum2), "test")>
        </cfif>
        <cfset loopNum2++ />
    </cfloop>
    <cfset loopnum++ />
</cfloop>
Run Code Online (Sandbox Code Playgroud)

这是创建的查询对象.它说"测试",但希望它能给出值:

查询对象是从我疯狂的循环中创建的

Ste*_*ant 5

你的问题是StructKeyExists函数正在寻找一个名为"criterion.text"的键(例如) - 这是可能的,而不是名为"criterion"的键中的"text"键.我掀起了一个应该为你解决问题的UDF:

 <cffunction name="StructGetByKeyList">
    <cfargument name="struct">
    <cfargument name="key">

    <cfset var result = "">

    <cfif StructKeyExists(struct,ListFirst(key,"."))>
        <cfif ListLen(key,".") GT 1>
            <cfreturn StructGetByKeyList(struct[ListFirst(key,".")],ListRest(key,"."))>
        <cfelse>
            <cfreturn struct[key]>
        </cfif>
    <cfelse>
        <cfreturn "">
    </cfif>
 </cffunction>
Run Code Online (Sandbox Code Playgroud)

然后你可以调用Len(StructGetByKeyList(aKeywordsAll [loopnum],j))而不是structKeyExists(aKeywordsAll [loopnum],j).

对于这一行:

 <cfset QuerySetCell(myquery, listGetAt(vColumns, loopNum2), aKeywordsAll[loopnum][j])>
Run Code Online (Sandbox Code Playgroud)

用这个:

 <cfset QuerySetCell(myquery, listGetAt(vColumns, loopNum2), StructGetByKeyList(aKeywordsAll[loopnum],j))>
Run Code Online (Sandbox Code Playgroud)