【问题标题】:nesting "cfloop" tags to loop through pairs嵌套“cfloop”标签以循环遍历对
【发布时间】:2026-01-21 10:45:01
【问题描述】:

我目前正在尝试创建一个<select> 下拉列表,它将根据URL 变量(或默认值)选择哪个<option>。但是,我不希望我的选项列表看起来像;

name_az、name_za、最新、最旧

因为这不是很用户友好,但我也不想在我的代码中使用这些;

名称 A-Z(默认)、名称 Z-A、最新频段、最旧频段

因为显然这让我自己的工作量更大。

我可以手动创建每个选项列表并对每组选项进行<cfif> 检查以选择所需的选项。但是,正如任何设计师都知道的那样,当您可以创建一个循环列表并简单地向该列表添加两个值时,这会产生很多额外的、不需要的工作。

以下是我目前拥有的代码;

<select>
    <cfset sortlist = "name_az|Name A-Z (Default),name_za|Name Z-A,newest|Newest Bands,oldest|Oldest Bands">
    <cfoutput>
        <cfloop list="#sortlist#" delimiters="," index="sortpair">
            <cfloop list="#sortpair#" delimiters="|" index="sortphrase">
                <option value="#sortphrase#">#sortphrase#</option>
            </cfloop>
        </cfloop>
    </cfoutput>
</select>

我希望它返回这个:

<select>
    <option value="name_az">Name A-Z (Default)</option>
    <option value="name_za">Name Z-A</option>
    <option value="newest">Newest Bands</option>
    <option value="oldest">Oldest Bands</option>
</select>

但是,显然我要求它在列出的任何地方返回sortphrase,所以它将返回如下:

<select>
    <option value="name_az">name_az</option>
    <option value="Name A-Z (Default)">Name A-Z (Default)</option>
    <option value="name_za">name_za</option>
    <option value="Name Z-A">Name Z-A</option>
    etc..
</select>

有没有办法创建一个&lt;cfloop&gt;,我可以在其中循环x 列表中的值数量?

【问题讨论】:

    标签: arrays list loops coldfusion


    【解决方案1】:

    您使用嵌套循环的想法对我来说似乎是错误的。把它当成是可以的 |分隔列表,但为什么要循环呢?你最终会得到两倍于你需要的选项标签。试试

    <cfloop list="#sortlist#" delimiters="," index="sortpair">
        <option value="#listFirst(sortpair, '|')#">#listLast(sortpair, '|')#</option>
    </cfloop>
    

    此外,在 Coldfusion 中,数组通常比列表执行得更快。对于像这样的小东西,这并不重要,但我通常会使用数组而不是列表,至少对于循环而言(但可能仍然使用 |-delimited 列表作为两个单独的部分)。

    或者,您可以为每个键值对使用一个结构。例如这是使用关联数组表示法的另一种方法:

    <cfset sortarray = [
        {name = "name_az", value = "Name A-Z (Default)"},
        {name = "name_za", value = "Name Z-A"},
        {name = "newest", value = "Newest Bands"},
        {name = "oldest", value = "Oldest Bands"}
    ]>
    
    <cfloop array="#sortarray#" index="sortstruct">
        <option value="#sortstruct['name']#">#sortstruct['value']#</option>
    </cfloop>
    

    或使用结构符号:

    <cfloop array="#sortarray#" index="sortstruct">
        <option value="#sortstruct.name#">#sortstruct.value#</option>
    </cfloop>
    

    【讨论】:

    • 这就是我想说的,循环它的概念在一种方式上是“正确的”,因为你想循环列表本身,但显然你不能设置 'from' 和 'to ' cfloop 列表中的值。但是,您的解决方案看起来就是我需要的解决方案,我之前没有看到 #listFirst# 和 #listLast# 属性,所以谢谢!我现在就试试这个。
    • 绝对喜欢数组的想法。这是一种比拥挤的清单更合适的方式。您可以更轻松地阅读这些值以发现任何问题,并且创建新值也很容易。谢谢你:)
    • 我遇到了一个小问题,我已经复制并粘贴了您的代码,但我收到一条错误消息,提示“变量名称未定义”
    • 他的代码应该是 sortStruct['name']sortStruct.Name value。我已通过更新提交了对他的回答的修改。
    • @Busches 效果很好,干杯。将此答案标记为正确。