如何在Coldfusion中检查数组的第一行/最后一行?

时间:2013-06-13 13:50:37

标签: coldfusion

我已经构建了一个基本的导航菜单,其中子菜单由数组控制,但是(仅用于一分钟的样式用途)我希望能够检查数组何时输出第一行/最后一行,以便我可以删除<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等于它,然后它现在只删除底部边框。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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在他的回答中提到的那样,只有在您的示例中使用序列索引时,此解决方案才有效。