如何访问嵌套数组

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>