ColdFusion数组和结构

CF-*_*yer 1 arrays coldfusion struct coldfusion-9

我在会话中存储了一个购物车阵列:购物车阵列屏幕截图

我让我的用户能够选择要删除的所有项目或通过复选框选择单个项目.

我通过表单发送数组索引到arrayDeleteAt.

现在,如果我选择底部的3个项目,它不会删除它.

这是我的删除代码:

<cfif isDefined("form.leadId") AND  listLen(form.leadId)>
  <cfloop from="#listLen(form.leadId)#" to="1" step="-1" index="i">
    <cfset temp = arrayDeleteAt(session.shoppingcart, #i#)>
  </cfloop> 
</cfif>
Run Code Online (Sandbox Code Playgroud)

Tyl*_*nin 7

这种管理购物车的方法会遇到更多问题.使用ArrayDeleteAt后,将重新计算数组的索引,因此当您很可能从数组中删除错误的项时,或者在尝试删除超出范围的项时可能会出错.

看到你试图通过列表向后工作来解决这个问题,但Dan对于你上面代码的问题是正确的,但是如果列表以错误的顺序传递,那么你就处于一个受伤的世界.

我建议使用带有代理键的结构(例如UUID),而不是使用数组,然后通过该键删除项目.


Dan*_*ort 5

问题是你要删除计数器的位置,而不是正在传入的表单字段.请尝试这样做:

<cfset temp = arrayDeleteAt(session.shoppingcart, ListGetAt(FORM.leadID, i) />
Run Code Online (Sandbox Code Playgroud)

更新:要解决Tyler提到的问题,您可以FORM.leadID使用索引将索引列表转换为数组ListToArray,然后ArraySort按顺序获取它们以确保删除正确.

虽然我的回答确实可以解决你的问题,但你肯定会更好地遵循Tyler的建议并使用购物车中每件商品的钥匙来确保你管理的是你认为应该管理的那个:)