2012-02-12 32 views
6

Tôi có một mảng giỏ hàng, trong đó có một biến để cho tôi biết nếu sản phẩm là một phụ kiện hay không, điều này sẽ là có hoặc không. Tôi cần phải vòng qua giỏ hàng và tìm hiểu những điều sau:Lặp qua một mảng bằng cách sử dụng Coldfusion

  • Nếu giỏ hàng chỉ chứa phụ kiện; làm bất cứ điều gì.
  • Nếu giỏ hàng chỉ là sản phẩm; làm bất cứ điều gì.
  • Nếu giỏ hàng có sản phẩm và phụ kiện; làm bất cứ điều gì.

Tôi đã cố gắng này:

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

này rơi xuống như accPresent không được tìm thấy, điều này tôi nghĩ là do thực tế vòng đi qua cùng một lúc và ACCS không bằng để có một khi nó tìm thấy một sản phẩm không phụ kiện. Cách tốt nhất để đạt được những gì tôi đang cố gắng làm là gì?

Trả lời

6

Làm điều này

<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

Cũng không nên ' là '

+0

Ngoài ra

3

Jason,

tuyên bố thứ 3 của bạn giả định rằng AccPresent và ProdPresent cả sẽ tồn tại. Bạn đã tạo chúng trước và cung cấp cho chúng giá trị mặc định? Hãy thử điều này:

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

Giả định này tất nhiên phải được đặt thành "không" theo mặc định.

+0

(được đề xuất leigh cũng là một CFBREAK. Đó là một suy nghĩ tốt - nhưng tôi nghi ngờ rằng một giỏ mua hàng sẽ có một mảng khá nhỏ, vì vậy bạn sẽ không nhận được bất kỳ hiệu suất đá ra khỏi đó. Tuy nhiên, nó thực sự sẽ là cách hiệu quả nhất để đi với 2 vòng. Ngay sau khi bạn có "có" bạn thoát ra khỏi vòng lặp và chuyển sang khối tiếp theo. –

+0

Thực ra tôi đã hiểu sai câu hỏi;) Tôi nghĩ rằng họ chỉ quan tâm đến hai điều kiện (hasAccessories = true/false) để 'cfbreak' có ý nghĩa hơn ở đó. – Leigh

+0

Mặc dù nếu nó là một mảng nhỏ, họ chỉ có thể đếm số lượng của mỗi. Sau đó, sử dụng số đếm để xác định xem cả hai đều có mặt tức là ' có cả hai' – Leigh

1

Trong CF 10 (hoặc Railo 4), điều này có thể được thực hiện thanh lịch hơn khi sử dụng cfscript và 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; 

Những điều tuyệt vời về _.find() là nó dừng lại ngay khi iterator hàm trả về true, vì vậy bạn không phải lặp qua từng phần tử trong mảng.

Lưu ý: Sử dụng duplcate() được khuyến nghị khi truy cập các biến phạm vi được chia sẻ để ngăn chặn deadlocks.

(Disclaimer: Tôi đã viết Underscore.cfc)

1

Trong các phiên bản của ColdFusion 8 và cao hơn, một <cfloop> có thể sử dụng một mảng trực tiếp

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

Lưu ý: Đó i đề cập đến struct chứa dữ liệu chứ không phải vị trí của dữ liệu

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

Các vấn đề liên quan