0

我已经构建了一个基本导航菜单,其中子菜单由数组控制,但是(仅出于样式目的)我希望能够检查数组何时输出第一行/最后一行,以便我可以删除底部边框上<li>给出了一个整洁的子菜单。如果有人能够提供帮助,将不胜感激。

怎么做:

<cfset thisArray = [
    {name="Page", href="page.cfm"},
    {name="Page2", href="page2.cfm"}
]>
<cfif arrayLen(thisArray) neq 0>
    <cfset start = 1>
    <ul>
        <cfloop array="#thisArray#" index="array">
            <cfif start eq arrayLen(thisArray)>
                <li class="navItem" style="border-bottom: 0;"><a href="#array['href']#">#array['name']#</a></li>
            <cfelse>
                <li class="navItem"><a href="#array['href']#">#array['name']#</a></li>
            </cfif>
            <cfset start = start + 1>
        </cfloop>
    </ul>
</cfif>

这基本上就是我希望它工作的方式,检查最后一行,或当前行匹配最后一行,这通常适用于查询但是我可以告诉它不适用于数组,因为我已经尝试过这种方法并且它没有不适合我。谢谢。

编辑: 我刚刚找到了一个解决方案,使用一个名为的自定义变量start并将其设置为 1,每次执行循环时,它都会递增 1,并检查数组长度,如果start等于它,那么它只是现在删除底部边框。

4

2 回答 2

3

这开始是一个评论,但它有点啰嗦。Miguel-F 的答案在大多数情况下都很好,但它确实包含一个可能的缺陷。

考虑:

<cfset myArray=["Z","Y","X","A","B","C"]> 
<cfset myArray[20]="gotcha!">
<cfoutput>
    #arrayLen(myArray)# <!--- 20 --->
</cfoutput>

Miguel-F 解决方案中的计数器只会达到 7,因为与arrayLen cfloop忽略空元素不同。

这个小问题的解决方法是改变

<cfset i = 0>
<cfloop array="#thisArray#" index="array">
    <cfset i = i + 1>
    <cfif i eq ArrayLen(thisArray)>

<cfset i = 0>
<cfset lastRow = listLen(arrayToList(thisArray,"^"),"^")> 
<!--- You can change your delim to your choice of obscure delims --->
<cfloop array="#thisArray#" index="array">
    <cfset i = i + 1>
    <cfif i eq lastRow>

对于像您这样的简单数组或包含复杂数据的数组,您也可以这样做;我使用索引循环而不是直接循环数组:

<cfset thisArray = [
    {name="Page", href="page.cfm"},
    {name="Page2", href="page2.cfm"}
]>
<cfset thisArray[20]={name="Page20", href="page20.cfm"}>
<cfif arrayLen(thisArray) neq 0>
    <ul>
        <cfloop from = "1" to = "#arrayLen(thisArray)#" index="i">
            <cfif arrayIsDefined(thisArray,i)>
                <cfif i eq arrayLen(thisArray)>
                    <li class="navItem" style="border-bottom: 0;"><a href="#thisArray[i]['href']#">#thisArray[i]['name']#</a></li>
                <cfelse>
                    <li class="navItem"><a href="#thisArray[i]['href']#">#thisArray[i]['name']#</a></li>
                </cfif>
            </cfif>
        </cfloop>
    </ul>
</cfif>
于 2013-06-13T14:15:36.113 回答
2

您可以添加一个计数器并检查它的值是否等于数组中的元素数。像这样的东西:

<cfset i = 0>
<cfset lengthOfArray = ArrayLen(thisArray)>
<ul>
<cfloop array="#thisArray#" index="array">
    <cfset i = i + 1>
    <cfif i eq lengthOfArray>
        <li class="navItem" style="border-bottom: 0;"><a href="#array['href']#">#array['name']#</a></li>
    <cfelse>
        <li class="navItem"><a href="#array['href']#">#array['name']#</a></li>
    </cfif>
</cfloop>
</ul>

正如 Travis 在他的回答中提到的那样,只有在您的示例中使用顺序索引作为数组时,此解决方案才有效。

于 2013-06-13T13:55:07.547 回答