如何访问嵌套数组
How to access nested array
我正在尝试访问此数组中的 recipeIngredient。
我试过这个:
<cfloop from="1" to="#ArrayLen(contents)#" index="i">
<cfoutput>
#i.recipeIngredient#<br>
</cfoutput>
</cfloop>
我收到一条错误消息“您试图将 class coldfusion.runtime.Array 类型的标量变量作为具有成员的结构取消引用。”
您正在使用嵌套数据,因此您需要检查具有键 recipeIngredient
的特定结构是否存在以输出它。
在那种情况下,我不会通过 index 迭代数组,因为 CFML 通过使用属性 array[= 提供了 cfloop 数组的绝佳可能性23=] 并按其 items 对其进行迭代,这样感觉更自然且更易于阅读。
此外,不要将 <cfoutput>
添加到循环的内部主体,因为它会增加您的 cfengine 的开销。相反,使用 cfoutput 拥抱循环。
<cfoutput>
<cfloop array="#contents#" item="item">
<cfif isStruct( item ) and structKeyExists( item, "recipeIngredient")>
<cfloop array="#item.recipeIngredient#" item="ingredient">
#ingredient#<br>
</cfloop>
</cfif>
<!--- for looping over a struct like recipeinstructions use collection attribute--->
<cfif isStruct( item ) and structKeyExists( item, "recipeinstructions")>
<cfloop collection="#item.recipeinstructions#" item="key">
Value for key '#encodeForHTML(key)#': #encodeForHTML( item.recipeinstructions[key])#<br>
</cfloop>
</cfif>
</cfloop>
</cfoutput>
另一种循环方式是使用index
循环代替array
循环或collection
循环,然后从1循环到arrayLen()
大批。无论哪种方式都可以。我通常更喜欢这种方法,因为在访问更深的嵌套级别结构和数组时更容易阅读。如果您选择使用它,您可以按如下方式重构您的代码。如果你想看,我在这里创建了一个working demo。
<cfoutput>
<h4>Ingredients</h4>
<cfloop index="i" from="1" to="#arrayLen(contents['recipeIngredient'])#">
#contents['recipeIngredient'][i]# <br>
</cfloop>
<h4>Instructions</h4>
<cfloop index="i" from="1" to="#arrayLen(contents['recipeInstructions'])#">
#contents['recipeInstructions'][i]['@type']# <br>
#contents['recipeInstructions'][i]['name']# <br>
#contents['recipeInstructions'][i]['text']# <br>
#contents['recipeInstructions'][i]['url']# <br>
#contents['recipeInstructions'][i]['image']# <br>
<br>
</cfloop>
</cfoutput>
我正在尝试访问此数组中的 recipeIngredient。
我试过这个:
<cfloop from="1" to="#ArrayLen(contents)#" index="i">
<cfoutput>
#i.recipeIngredient#<br>
</cfoutput>
</cfloop>
我收到一条错误消息“您试图将 class coldfusion.runtime.Array 类型的标量变量作为具有成员的结构取消引用。”
您正在使用嵌套数据,因此您需要检查具有键 recipeIngredient
的特定结构是否存在以输出它。
在那种情况下,我不会通过 index 迭代数组,因为 CFML 通过使用属性 array[= 提供了 cfloop 数组的绝佳可能性23=] 并按其 items 对其进行迭代,这样感觉更自然且更易于阅读。
此外,不要将 <cfoutput>
添加到循环的内部主体,因为它会增加您的 cfengine 的开销。相反,使用 cfoutput 拥抱循环。
<cfoutput>
<cfloop array="#contents#" item="item">
<cfif isStruct( item ) and structKeyExists( item, "recipeIngredient")>
<cfloop array="#item.recipeIngredient#" item="ingredient">
#ingredient#<br>
</cfloop>
</cfif>
<!--- for looping over a struct like recipeinstructions use collection attribute--->
<cfif isStruct( item ) and structKeyExists( item, "recipeinstructions")>
<cfloop collection="#item.recipeinstructions#" item="key">
Value for key '#encodeForHTML(key)#': #encodeForHTML( item.recipeinstructions[key])#<br>
</cfloop>
</cfif>
</cfloop>
</cfoutput>
另一种循环方式是使用index
循环代替array
循环或collection
循环,然后从1循环到arrayLen()
大批。无论哪种方式都可以。我通常更喜欢这种方法,因为在访问更深的嵌套级别结构和数组时更容易阅读。如果您选择使用它,您可以按如下方式重构您的代码。如果你想看,我在这里创建了一个working demo。
<cfoutput>
<h4>Ingredients</h4>
<cfloop index="i" from="1" to="#arrayLen(contents['recipeIngredient'])#">
#contents['recipeIngredient'][i]# <br>
</cfloop>
<h4>Instructions</h4>
<cfloop index="i" from="1" to="#arrayLen(contents['recipeInstructions'])#">
#contents['recipeInstructions'][i]['@type']# <br>
#contents['recipeInstructions'][i]['name']# <br>
#contents['recipeInstructions'][i]['text']# <br>
#contents['recipeInstructions'][i]['url']# <br>
#contents['recipeInstructions'][i]['image']# <br>
<br>
</cfloop>
</cfoutput>