我需要从结构数组中创建一个查询对象。该阵列有大约200个键,阵列内部的结构在名称,大小和深度上有所不同。这是一个节点的样子:
我已经使它适用于数组[#i] .adGroupId和数组[#i#]。userStatus但我需要在将结构值添加到查询之前检查结构值是否存在。 criterion.text例如并不总是在结构中,所以我需要检查,但不知道如何。这是迄今为止的代码,但它总是跳过criterion.text和bid.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>
这是创建的查询对象。它说“测试”,但希望它能给出值:
答案 0 :(得分: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>
然后你可以调用Len(StructGetByKeyList(aKeywordsAll [loopnum],j))而不是structKeyExists(aKeywordsAll [loopnum],j)。
对于这一行:
<cfset QuerySetCell(myquery, listGetAt(vColumns, loopNum2), aKeywordsAll[loopnum][j])>
使用此:
<cfset QuerySetCell(myquery, listGetAt(vColumns, loopNum2), StructGetByKeyList(aKeywordsAll[loopnum],j))>