我有一个购物车阵列,它有一个变量告诉我该产品是否是附件,这将是是或否。我需要遍历购物车并找出以下内容:
我一直在尝试这个:
<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,这就失败了,我认为这是因为循环一次经过一个,并且一旦找到非附属产品,accs就不等于是。实现我想要做的最好的方法是什么?
答案 0 :(得分: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 :(得分: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”。
答案 2 :(得分: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
答案 3 :(得分: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)