2012-02-12 23 views
6

商品がアクセサリーであるかどうかを示す変数を持つショッピングカートアレイがあります。これははいかいいえのいずれかです。カートをループして次の項目を調べる必要があります。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が発見されていないとして、これは私が考えるループは、一度に1つを通過し、ACCSが等しくないことに起因する倒れます一度それは非付属品を見つける。私がやろうとしていることを達成する最良の方法は何ですか?

答えて

6

あなたの第三文がAccPresentとProdPresentが両方存在することを前提とし、この

<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

もすべきではない '

+0

また、2番目の

3

ジェイソン、

を行います。最初に作成してデフォルト値を与えましたか?試してみてください:

これは、デフォルトではそれぞれ「いいえ」に設定する必要があることを前提としています。

+0

(leigh suggested CFBREAKも同様です。これはいい考えですが、ショッピングカートにはかなり小さな配列があると思われますので、パフォーマンスを上げることはできません。それでも、実際には2ループで行くのが最も効率的な方法です。あなたが "はい"を持ってすぐに、あなたはループから脱して、次のブロックに移動します。 –

+0

実際に私は質問を間違って読んでいました;)彼らは2つの条件(hasAccessories = true/false)にしか関心がないと思っていましたので、 'cfbreak'はもっと意味がありました。 – Leigh

+0

小さな配列であれば、それぞれの数を数えることができます。次に、カウントを使用して両方が存在するかどうかを確認します。つまり、には両方とも Leigh

1
、これはCFScriptのを使用して、よりエレガントに行うことができるCF 10(またはRailo 4)では

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を返します。したがって、配列のすべての要素を繰り返し処理する必要はありません。

注:デッドロックを防ぐために、共有スコープ変数にアクセスする場合は、duplicate()を使用することをお勧めします。 iデータを含む構造体をいう:

(免責事項:私はUnderscore.cfcを書いた)の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> 
のアレイを使用することができるノートのバージョンで

関連する問題