Как перебрать два списка? - PullRequest
       16

Как перебрать два списка?

3 голосов
/ 06 февраля 2012

Мне нужно объединить выходные данные двух отдельных списков для вывода в CFMAIL, и мне интересно, каков наилучший способ приблизиться к этому.

У меня есть два поля формы: first_name и last_name

Поля имеют до 5 имен в каждом. Мне нужно перебрать эти имена и соединить имена и фамилии, а затем вывести их в неупорядоченный список. У меня возникают проблемы с визуализацией, какой правильный подход для достижения этой цели.

Может кто-нибудь предложить метод в CFML (я не очень хорошо знаю CFSCRIPT).

Спасибо!

РЕДАКТИРОВАТЬ: Я должен был добавить, что оба поля всегда будут иметь одинаковое количество записей. Спасибо всем, кто ответил - доказательство того, что есть много способов снять шкуру с кошки:)

Ответы [ 5 ]

4 голосов
/ 06 февраля 2012

Я бы сделал что-то вроде

<cfloop from="1" to="#ListLen(firstnames)#" index="i">
#ListGetAt(firstnames,i)# #ListGetAt(lastnames,i)#<br>
</cfloop>

Если бы это был список из 5000, вам было бы лучше поместить его в структуру или массив, но для списка ~ 5 этого должно быть достаточно.

1 голос
/ 06 февраля 2012

Вы можете использовать атрибут «list» с CFLOOP, хотя это означает объединение функций списка в выходных данных.Вот пример того, как это можно сделать, и он предполагает, что два списка всегда будут иметь одинаковую длину.Если эти имена вводятся пользователями, то я мог бы испугаться, если они введут запятую, поскольку это может привести к возникновению каких-либо циклов.

<cfset lstFirstNames    = "John,Bob,Tom,Jeff" />
<cfset lstLastNames     = "Smith,Doe,Rodriguez,Horan" />

<cfloop list="#Variables.lstFirstNames#" index="FirstName" />
    #FirstName# #ListGetAt(Variables.LastNames, ListFind(Variables.lstFirstNames, FirstName))#<br />
</cfloop>
1 голос
/ 06 февраля 2012

Я бы добавил проверку, чтобы убедиться, что значения вашего списка существуют в каждом индексе, иначе вы получите ошибки. Я также добавил бы проверку, чтобы пройтись по списку, который больше, так что вы получите все значения на тот случай, если кто-то не введет точно 5 в обоих:

<Cfset firstnames="Matt,Ian,Brandon,Sam,Tom">
<cfset lastnames="Jones,Smith,Weiss">

<!--- SEE WHICH LIST IS LONGER AND SET THAT AS THE ONE THAT WE WILL USE FOR THE LOOP --->
<cfif ListLen(firstnames) gte ListLen(lastnames)>
    <cfset primary=firstnames>
<cfelse>
    <cfset primary=lastnames>
</cfif>

<cfset myOutput="<ul>">
<cfloop from="1" to="#ListLen(primary)#" index="i">
    <Cfset myOutput &= "<li>">

    <cfif ListLen(firstnames) gte i>
        <cfset myOutput &= ListGetAt(firstnames,i)>
    </cfif>

    <cfif ListLen(lastnames) gte i>
        <cfset myOutput &= " " & ListGetAt(lastnames,i)>
    </cfif>

    <Cfset myOutput &= "</li>">
    </cfloop>
<Cfset myOutput &= "</ul>">


<cfoutput>#myOutput#</cfoutput>
1 голос
/ 06 февраля 2012

Я думаю, что это будет самый простой способ сделать это.

<!--- Create a names container --->
<cfset names = "<ul>">
<!--- Fill some dummy containers --->
<cfset first = "thomas,henry,philip,john,rony">
<cfset last = "smith,baker,crowe,ryan,jones">
<!--- Loop through the lists and append them to the container string --->
<cfloop index="name" to="#listLen(first)#" from="1">
 <cfset names &= "<li>" & ListGetAt(first,name) & " " & ListGetAt(last,name) & "</li>">
</cfloop>
<cfset names &= "</ul>">
<cfoutput>#names#</cfoutput>
0 голосов
/ 09 марта 2015

попробуй:

<cfset lstFirstNames    = "John,Bob,Tom,Jeff" />
<cfset lstLastNames     = "Smith,Doe,Rodriguez,Horan" />

<cfloop list="#Variables.lstFirstNames#" index="FirstName">
    <cfoutput>#FirstName# #ListGetAt(Variables.lstLastNames, ListFind(Variables.lstFirstNames, FirstName))#</cfoutput><br />
</cfloop>
...