1

每隔一段时间,无论是在显示代码中还是在组装字符串时,我都会制作一个列表,并且需要弄清楚如何在该列表中插入逗号。

我通常是这样做的:

<cfset hide_comma=true>
<cfloop ... some kind of loop ...>
    <cfif hide_comma><cfset hide_comma=false><cfelse>,</cfif>
    .... rest of code here ...
</cfloop>

我想知道是否有更清洁的方法来做到这一点。我意识到一个选项将类似于以下内容:

<cfset output_as_array = []>
<cfloop ... some kind of loop ...>
    <cfset loop_output = "">
    ... rest of code here, but append all output to loop output instead ...
    <cfset ArrayAppend(output_as_array, trim(loop_output))>
</cfloop>
<cfoutput>#ArrayToList(output_as_array, ", ")#</cfoutput>

但这似乎并没有更清楚。

相比之下,在 Django 中,每个循环都有一个内置计数器,因此我可以编写如下内容:

{% for ... some kind of loop ... %}
    {% if not forloop.first %},{% endif %}
    ... rest of code here ...
{% endfor %}

几乎相同的逻辑,只是已经有一种检查循环状态的内置方法,而不必自己创建一个。我知道在循环 a 时<cfoutput query=...>我可以QueryName.RowCount用于此目的,但在 s 的文档中找不到类似的东西CFLOOP

4

3 回答 3

6

对于编译变量,使用ValueList(用于查询)和ArrayToList函数是一种明智的方法。

如果不处理查询或数组,请使用 ArrayAppend 构建数组,然后使用ArrayToList转换为字符串。

(注意:ListAppend可以用于一两个项目,但在长循环中它比使用 ArrayAppend+ArrayToList 慢 - 请参阅此处的信息。)


关于:

几乎相同的逻辑,只是已经有一种检查循环状态的内置方法,而不必自己创建一个。我知道在循环时我可以使用 QueryName.RowCount 来达到这个目的,但在 CFLOOPs 的文档中找不到类似的东西。

简短的回答:不,除了标准的 from/to 和查询循环之外, ColdFusion 中没有内置的循环自动索引。


对于索引循环,您当然可以使用索引:

<cfloop index="Index" from=1 to=#ArrayLen(MyArray)#>
    <cfif Index GT 1> Not First Row </cfif>
</cfloop>

对于查询循环,使用 rowcount:

<cfloop query="MyQuery">
    <cfif MyQuery.RowCount GT 1> Not First Row </cfif>
</cfloop>

对于遍历项目,您需要创建自己的变量:

<cfset Row = 0 />
<cfloop index="Item" array=#MyArray#>
    <cfif ++Row GT 1> Not First Row </cfif>
</cfloop>

<cfset Row= 0 />
<cfloop item="Item" collection=#MyStruct# >
    <cfif ++Row GT 1> Not First Row </cfif>
</cfloop>

在 Railo 中,您可以指定 index 和 item 属性,并且这两个值都可用:

<cfloop index="Index" item="Item" array=#MyArray#>
    <cfif Index GT 1> Not First Row </cfif>
</cfloop>

索引指的是键,所以你不能用结构来做到这一点(你会得到键名,而不是行号)。

于 2013-08-23T16:36:14.543 回答
3

您可以使用ListAppend()

示例代码:

<cfset myList = "" />
<cfloop ....>
    <cfset myList = listAppend( myList, 'some value') />
</cfloop>

这将为您提供一个逗号分隔的列表。如果您想/需要列出由另一个字符分隔的列表,您可以将其指定为第二个参数listAppend()

我刚刚在这里进行了测试-似乎使用arrayAppend()thenarrayToList()比使用listAppend(). 所以使用数组追加的代码应该是最好的路径。

于 2013-08-23T15:52:48.070 回答
0

我喜欢做这样的事情:

<cfset separator="">
<cfloop ...>
  #variables.separator#
  <!--- rest of code here --->
  <cfset separator=", ">
</cfloop>
于 2013-08-23T16:42:37.673 回答