如何在 CFML 的循环内的变量中嵌套循环迭代
How do I accomplish nesting a loop iteration in a variable inside a loop in CFML
我正在尝试循环访问 CFML 中的 json 响应,需要执行一次调用以获取页数,然后调用每个连续的页面,然后循环遍历项目以获取我的数据.这样做时,我有一个需要嵌套变量的嵌套循环。因此,例如,我的初始循环将导致:
#jsonarray.items.1.id#
#jsonarray.items.2.id#
#jsonarray.items.3.id#
#jsonarray.items.4.id#
and so on.
所以在我的内部循环中,我试图通过执行另一个循环来替换该数字:
<cfloop from="1" to="50" index="thisBatchItem">
</cfloop>
但是,我必须将索引嵌套在我的变量中,这当然行不通。
有人能指出我在这里遗漏了什么吗?
这是我正在使用的代码,您会看到我有问题的明显地方。我输入 #jsonarray.items.#thisBatchItem#.id# 只是为了展示我正在努力实现这一目标的位置。我知道这行不通。
<cfhttp method="GET" result="httpResp" url="https://example.com/api?filter[batch.date][gte]=2022-02-01&filter[batch.date][lte]=2022-03-07&page=1&per-page=50" throwonerror="false">
<cfhttpparam type="header" name="Authorization" value="Bearer XXXXXXXXXXXXXXXXXXXXXXXXXX">
<cfhttpparam type="header" name="Content-type" value="application/json">
</cfhttp>
<cfoutput>
<cfloop from="1" to="#pageCount#" index="thisPage">
<cfhttp method="GET" result="httpResp" url="https://example.com/api?filter[batch.date][gte]=2022-02-01&filter[batch.date][lte]=2022-03-07&page=#thisPage#&per-page=50" throwonerror="false">
<cfhttpparam type="header" name="Authorization" value="Bearer XXXXXXXXXXXXXXXXXXXXXXXXXX">
<cfhttpparam type="header" name="Content-type" value="application/json">
</cfhttp>
<cfset jsonarray = deserializeJson(httpResp.fileContent)>
<cfloop from="1" to="50" index="thisBatchItem">
<cfif StructKeyExists(jsonarray,"#jsonarray.items.#thisBatchItem#.id#")>
#jsonarray.items.[#thisBatchItem#].id#<br>
</cfif>
</cfloop>
</cfloop>
</cfoutput>
由于 items
是一个结构数组,因此使用“数组”循环更简单、更清晰。
如果某些结构键是可选的,请尝试使用 safe navigation operator ?.
。在下面的示例中,它可以防止在代码使用 non-existent 键名(如“lookMaNoErrors”?
时发生错误
<cfset jsonResponse = deserializeJson(httpResp.fileContent)>
<cfloop array="#jsonResponse.items#" index="currentItem">
id #currentItem.id#<br>
lookMaNoErrors #currentItem?.lookMaNoErrors#<br>
</cfloop>
更新:
要回答原题,您需要使用结构符号。另外,不要硬编码循环的上限,而是使用数组长度:
<cfloop from="1" to="#arrayLen(jsonResponse.items)#" index="itemIndex">
id #jsonResponse.items[itemIndex].id#
</cfloop>
我正在尝试循环访问 CFML 中的 json 响应,需要执行一次调用以获取页数,然后调用每个连续的页面,然后循环遍历项目以获取我的数据.这样做时,我有一个需要嵌套变量的嵌套循环。因此,例如,我的初始循环将导致:
#jsonarray.items.1.id#
#jsonarray.items.2.id#
#jsonarray.items.3.id#
#jsonarray.items.4.id#
and so on.
所以在我的内部循环中,我试图通过执行另一个循环来替换该数字:
<cfloop from="1" to="50" index="thisBatchItem">
</cfloop>
但是,我必须将索引嵌套在我的变量中,这当然行不通。
有人能指出我在这里遗漏了什么吗?
这是我正在使用的代码,您会看到我有问题的明显地方。我输入 #jsonarray.items.#thisBatchItem#.id# 只是为了展示我正在努力实现这一目标的位置。我知道这行不通。
<cfhttp method="GET" result="httpResp" url="https://example.com/api?filter[batch.date][gte]=2022-02-01&filter[batch.date][lte]=2022-03-07&page=1&per-page=50" throwonerror="false">
<cfhttpparam type="header" name="Authorization" value="Bearer XXXXXXXXXXXXXXXXXXXXXXXXXX">
<cfhttpparam type="header" name="Content-type" value="application/json">
</cfhttp>
<cfoutput>
<cfloop from="1" to="#pageCount#" index="thisPage">
<cfhttp method="GET" result="httpResp" url="https://example.com/api?filter[batch.date][gte]=2022-02-01&filter[batch.date][lte]=2022-03-07&page=#thisPage#&per-page=50" throwonerror="false">
<cfhttpparam type="header" name="Authorization" value="Bearer XXXXXXXXXXXXXXXXXXXXXXXXXX">
<cfhttpparam type="header" name="Content-type" value="application/json">
</cfhttp>
<cfset jsonarray = deserializeJson(httpResp.fileContent)>
<cfloop from="1" to="50" index="thisBatchItem">
<cfif StructKeyExists(jsonarray,"#jsonarray.items.#thisBatchItem#.id#")>
#jsonarray.items.[#thisBatchItem#].id#<br>
</cfif>
</cfloop>
</cfloop>
</cfoutput>
由于 items
是一个结构数组,因此使用“数组”循环更简单、更清晰。
如果某些结构键是可选的,请尝试使用 safe navigation operator ?.
。在下面的示例中,它可以防止在代码使用 non-existent 键名(如“lookMaNoErrors”?
<cfset jsonResponse = deserializeJson(httpResp.fileContent)>
<cfloop array="#jsonResponse.items#" index="currentItem">
id #currentItem.id#<br>
lookMaNoErrors #currentItem?.lookMaNoErrors#<br>
</cfloop>
更新:
要回答原题,您需要使用结构符号。另外,不要硬编码循环的上限,而是使用数组长度:
<cfloop from="1" to="#arrayLen(jsonResponse.items)#" index="itemIndex">
id #jsonResponse.items[itemIndex].id#
</cfloop>