Цикл по массиву с использованием ColdFusion - PullRequest
6 голосов
/ 13 февраля 2012

У меня есть массив корзины для покупок, в котором есть переменная, сообщающая мне, является ли продукт аксессуаром или нет, это будет либо да, либо нет.Мне нужно пройтись по корзине и выяснить следующее:

  • Если корзина содержит только аксессуары;делать что угодно.
  • Если корзина только для товаров;делать что угодно.
  • Если в корзине есть товары и аксессуары;делать что угодно.

Я пытался это:

<cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
  <cfif session.mycart[i].accs EQ "yes">
    <cfset accPresent = "yes">
  </cfif>
  <cfif session.mycart[i].accs EQ "no">
    <cfset prodpresent = "yes">
  </cfif>
</cfloop>

<cfif accPresent EQ "yes" and prodPresent EQ "no">
  <cfset  bothPresent EQ "yes">
</cfif>

Это падает, поскольку accPresent не найден, это, я думаю, связано с тем, что цикл проходит одинвремя и accs не равно yes, если он найдет не принадлежащий продукту.Какой лучший способ добиться того, что я пытаюсь сделать?

Ответы [ 4 ]

6 голосов
/ 13 февраля 2012

Сделай это

<cfset accPresent = "no" />
<cfset prodPresent = "no" />
<cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
    <cfif session.mycart[i].accs EQ "yes">
        <cfset accPresent = "yes">
    </cfif>
    <cfif session.mycart[i].accs EQ "no">
        <cfset prodpresent = "yes">
    </cfif>
</cfloop>

<cfif accPresent EQ "yes" and prodPresent EQ "no">
    <cfset  bothPresent EQ "yes">
</cfif>
3 голосов
/ 13 февраля 2012

Джейсон

Ваше третье заявление предполагает, что AccPresent и ProdPresent будут существовать. Вы создали их сначала и дали им значения по умолчанию? Попробуйте это:

<cfparam name="accPresent" default="no"/>
<cfparam name="prodPresent" default="no"/>
<cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
<cfif session.mycart[i].accs EQ "yes">
<cfset accPresent = "yes">
</cfif>
<cfif session.mycart[i].accs EQ "no">
<cfset prodpresent = "yes">
</cfif>
</cfloop>    
<cfif accPresent EQ "yes" and prodPresent EQ "no">
<cfset  bothPresent EQ "yes">
</cfif>

Это предполагает, конечно, что для каждого из них по умолчанию должно быть установлено «нет».

2 голосов
/ 08 мая 2014

В версиях ColdFusion 8 и выше, <cfloop> может использовать массив напрямую

<cfloop index="i" array="#session.mycart#">
  <cfif i.accs EQ "yes">
    <cfset accPresent = "yes">
  </cfif>
  <cfif i.accs EQ "no">
    <cfset prodpresent = "yes">
  </cfif>
</cfloop>

<cfif accPresent EQ "yes" and prodPresent EQ "no">
  <cfset  bothPresent EQ "yes">
</cfif>

Примечание: i относится к структуре, содержащей данные, а не к позиции данных

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_j-l_15.html

1 голос
/ 06 июля 2012

В CF 10 (или Railo 4) это можно сделать более элегантно, используя cfscript и библиотеку Underscore.cfc :

_ = new Underscore();

myCart = duplicate(session.myCart);

accPresent = _.any(myCart, function(val) {
    return val.accs;
});

prodPresent = _.any(myCart, function(val) {
    return !val.accs;
});

bothPresent = accPresent && prodPresent;

Самое замечательное в _.find () заключается в том, что он останавливается, как только функция итератора возвращает true, поэтому вам не нужно перебирать каждый отдельный элемент в массиве.

Примечание. Рекомендуется использовать duplcate () при доступе к переменным общего доступа для предотвращения взаимных блокировок.

(Отказ от ответственности: я написал Underscore.cfc)

...