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)
这是创建的查询对象.它说"测试",但希望它能给出值:

你的问题是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)
| 归档时间: |
|
| 查看次数: |
957 次 |
| 最近记录: |