嵌套“cfloop”标签以循环对

时间:2013-03-21 12:19:06

标签: arrays list loops coldfusion

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

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>

是否有办法创建<cfloop>,我可以在列表中循环x个数量的值?

1 个答案:

答案 0 :(得分:5)

你使用嵌套循环的想法对我来说似乎不对。可以将其视为|分开列表,但为什么要循环呢?您最终会得到两倍于您需要的选项标签。尝试

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

此外,通常阵列的执行速度比Coldfusion中的列表快。对于像这样小的东西并不重要,但我通常会使用数组而不是列表,至少对于循环来说(但可能仍然使用| -delimited list来表示两个独立的部分)。

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

<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>

使用struct notation:

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