2012-02-12 3 views
6

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

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

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

<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 не найдено, то я думаю, что это связанно с тем, петля проходит через один в то время, и АСС не равен когда он найдет неаксессуарный продукт. Каков наилучший способ добиться того, что я пытаюсь сделать?

ответ

6

ли это

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

Также не следует ' be '

+0

Также второй

3

Джейсон,

Ваше третье утверждение предполагает, что 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> 

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

+0

(leigh предложил CFBREAK. Это хорошая мысль, но я подозреваю, что у корзины покупок будет довольно небольшой массив, так что вы не получите от этого никакой производительности. Тем не менее, это был бы самый эффективный способ пойти с 2 циклами. Как только у вас будет «да», вы выйдете из цикла и перейдете к следующему блоку. –

+0

На самом деле я неправильно понял вопрос;) Я думал, что они касаются только двух условий (hasAccessories = true/false), поэтому «cfbreak» имеет больше смысла там. – Leigh

+0

Хотя, если это небольшой массив, они могут просто подсчитать количество каждого. Затем используйте подсчеты, чтобы определить, присутствуют ли оба из них, т.е. ' имеет как' – Leigh

1

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

_ = 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)

1

В версиях 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

 Смежные вопросы

  • Нет связанных вопросов^_^