6

私はショッピングカートの配列を持っています。これには、製品がアクセサリであるかどうかを示す変数があります。これは、yesまたは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>

accPresentが見つからないため、これは失敗します。これは、ループが一度に1つずつ通過し、アクセサリ以外の製品が見つかった場合、accsがyesと等しくないためだと思います。私がやろうとしていることを達成するための最良の方法は何ですか?

4

4 に答える 4

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>
于 2012-02-12T21:23:48.373 に答える
3

ジェイソン、

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>

もちろん、これは、これらのそれぞれがデフォルトで「no」に設定されていることを前提としています。

于 2012-02-12T21:27:00.120 に答える
2

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

于 2014-05-07T20:54:21.650 に答える
1

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を作成しました)

于 2012-07-06T04:28:30.193 に答える