我目前正在构建一个购物车,它使用数组中的结构来保存购物车信息。如果产品已经添加到购物车并再次按下添加到购物车按钮,我需要更新结构数量而不是将另一个项目添加到购物车。当按下添加到购物车按钮时,我首先检查数组是否为空,如果没有,我遍历数组寻找表单提交的产品ID,如果找到我只是更新与产品ID关联的数量字段,然后我设置一个变量addNew = no。如果找不到产品,我使用了cfelse设置变量addNew = yes。我意识到我的问题是什么,如果购物车有多个产品,循环继续,显然在某些时候它找不到产品ID并设置变量addNew = new,这将更新数量,也将将产品添加到新结构中,最后使用产品数量2和产品数量1。
这是第一次以这种方式使用数组和结构,我只是找到了解决方法,所以如果我的代码效率不高,我会道歉。任何指针都非常感谢;
<cfif arrayLen(session.mycart) GT 0>
<cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
<!---check for existance of the id submitted--->
<cfif session.mycart[i].itemID eq form.itemID>
<!---if the id is matched update the quantity--->
<cfset session.mycart[i].quantity = form.quantity+session.mycart[i].quantity>
<cfset myTotal = form.itemCost*session.mycart[i].quantity>
<cfset session.mycart[i].totalPrice = myTotal>
<!---this will tell the add to cart function not add a new item--->
<cfset addNew = "no">
<cfelse>
<!---as this is a new item tell the add to cart function to add it--->
<cfset addNew ="yes">
</cfif>
</cfloop>
<cfelse>
<!---as the array is empty tel the add to cart function insert the product--->
<cfset addNew ="yes">
</cfif>
答案 0 :(得分:3)
我能想到两件事。
首先,您可以通过去除阵列上的外部长度检查来简化代码:循环将为您覆盖。
其次,当您找到并更新数量(循环中IF的TRUE部分)时,您 - 此时 - 可以停止查找该项目。继续通过阵列的其余部分寻找你已经找到的东西是没有意义的。因此,在此时使用CFBREAK退出循环。
另一件需要记住的事情是,只有在尚未设置变量的情况下,才能使用CFPARAM设置变量。因此,如果将addNew设置为true,并且后续调用CFPARAM,则该变量将保持原样。但是在这种情况下,CFBREAK方法更好。
答案 1 :(得分:2)
你应该在开始时将标志设置为true,然后在循环时,如果找到产品,只需将标志设置为false。
<!--- first set the flag to add item to cart --->
<cfset addNew = true>
<cfloop index="i" from="1" to="#arrayLen(session.mycart)#">
<!---check for existance of the id submitted--->
<cfif session.mycart[i].itemID eq form.itemID>
<!---if the id is matched update the quantity--->
<cfset session.mycart[i].quantity = form.quantity+session.mycart[i].quantity>
<cfset myTotal = form.itemCost*session.mycart[i].quantity>
<cfset session.mycart[i].totalPrice = myTotal>
<!---if the item is already in the cart, tell the add to cart function not add a new item--->
<cfset addNew = false>
</cfif>
</cfloop>
答案 2 :(得分:1)
听起来你需要的是购物车中每件商品的布尔值,而不仅仅是一个。所以你甚至可以将它添加到现有结构中。即使ColdFusion允许你使用字符串“yes”和“no”作为布尔值,我认为你最好使用true和false。
<cfif session.mycart[i].itemID eq form.itemID>
<!---if the id is matched update the quantity--->
<cfset session.mycart[i].quantity = form.quantity+session.mycart[i].quantity>
<cfset myTotal = form.itemCost*session.mycart[i].quantity>
<cfset session.mycart[i].totalPrice = myTotal>
<!---this will tell the add to cart function not add a new item--->
<cfset session.mycart[i].addNew = FALSE>
<cfelse>
<!---as this is a new item tell the add to cart function to add it--->
<cfset session.mycart[i].addNew =TRUE>
</cfif>