2012-02-12 44 views
6

Tengo una matriz de carrito de la compra, que tiene una variable para indicarme si el producto es o no accesorio, esto será sí o no. Necesito recorrer el carro y averiguar lo siguiente:Looping a través de una matriz con ColdFusion

  • Si el carrito contiene solo accesorios; hacer cualquier cosa.
  • Si el carrito es solo productos; hacer cualquier cosa.
  • Si el carro tiene productos y accesorios; hacer cualquier cosa.

me han estado tratando esto:

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

Esto cae como no se encuentra accPresent, esto creo que es debido al hecho del bucle pasa por uno a la vez y los ACC no es igual a sí una vez que encuentra un producto no accesorio. ¿Cuál es la mejor manera de lograr lo que intento hacer?

Respuesta

6

Haga esto

<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

también debe no ' ser '

+0

También el segundo

3

Jason,

su tercera declaración asume que AccPresent y ProdPresent serán tanto existir. ¿Los creaste primero y les das valores predeterminados? Pruebe esto:

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

Esto asume por supuesto que cada uno de estos debe establecerse en "no" de forma predeterminada.

+0

(leigh sugirió un CFBREAK también. Es una buena idea, pero sospecho que un carrito de compras tendría una matriz bastante pequeña, por lo que no obtendría ningún rendimiento patada de eso. Aún así, en realidad sería la forma más eficiente de ir con 2 bucles. Tan pronto como tenga un "sí" saldrá del ciclo y pasará al siguiente bloque. –

+0

En realidad, leí mal la pregunta;) Pensé que solo estaban preocupados por dos condiciones (hadAccessories = true/false) por lo que 'cfbreak' tenía más sentido allí. – Leigh

+0

Aunque si es una matriz pequeña, solo podrían contar el número de cada una. A continuación, utilice los recuentos para determinar si ambos están presentes, es decir, ' tiene ambos' – Leigh

1

En CF 10 (o Railo 4), esto se puede hacer de manera más elegante usando cfscript y la 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; 

Lo bueno de _.find() es que se detiene tan pronto como el iterador la función devuelve verdadero, por lo que no tiene que iterar sobre cada elemento de la matriz.

Nota: Se recomienda utilizar Duplcate() al acceder a variables de ámbito compartido para evitar interbloqueos.

(Negación: I escribió Underscore.cfc)

1

En las versiones de ColdFusion 8 y superior, un <cfloop> puede utilizar una matriz directamente

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

Nota: Eso i se refiere a la estructura que contiene los datos , no la posición de los datos

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

Cuestiones relacionadas