我已经构建了一个基本的导航菜单,其中子菜单由数组控制,但是(仅用于一分钟的样式用途)我希望能够检查数组何时输出第一行/最后一行,以便我可以删除<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
等于它,然后它现在只删除底部边框。
答案 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在他的回答中提到的那样,只有在您的示例中使用序列索引时,此解决方案才有效。