【问题标题】:How to delete item ID from array used as session shopping cart如何从用作会话购物车的数组中删除项目 ID
【发布时间】:2015-08-31 13:17:47
【问题描述】:

我有一个只有 ID 号的 SESSION['cart']。我有一个通过删除按钮传递 ID 的表单。一旦传递给我的控制器,我无法弄清楚如何编写使用 ID ($_POST['id']) 从 SESSION['cart'] 中删除项目的代码。

我可以循环显示数组内容,但我不知道如何根据从表单传递的 ID 删除。

如何遍历 SESSION['cart'] 数组以查找与从我的删除表单传递的 ID 匹配的匹配项,然后删除该 ID?我知道 unset($_SESSION['cart'][X] 删除索引 X 处的 ID,但我不知道如何遍历所有元素以找到匹配项。

我已阅读此论坛中的许多相关问题,但无法应用任何这些解决方案来解决这一挑战。任何帮助表示赞赏。

【问题讨论】:

  • 顺便说一句,您确实有一个仅存储文章 id 的购物车变量?我很确定你至少需要一个数量......
  • 谢谢。数量不包括在内,但我确实计划在解决此挑战后添加它。

标签: php arrays session


【解决方案1】:

你拥有你的价值观的方式 ($products = array(3,7,99,152)) 不是一个很好的方法。 每次你想执行一个动作时,你都必须遍历数组,你不希望这样。除此之外,您如何存储数量?或变体,例如尺寸还是颜色?

如果你的结构是$array[ ID_OF_PRODUCT ],你可以这样做:

unset( $_SESSION['cart'][$_POST['id']] ); // Instant access via the key!

这应该是使用的方法。这允许您创建这样的数组,具有高级信息,但易于访问(42/63 是示例 id)

$_SESSION['cart']['products'][42] = array(
    'quantity' = 11,
    'size'     = 'large',
    'color'    = 'blue'
);
$_SESSION['cart']['products'][63] = array(
    'quantity' = 9,
    'size'     = 'small',
    'color'    = 'red'
);

通过这种方式,您可以使用产品 ID 访问大量信息,现在还可以查看用户选择的尺寸和颜色(均为示例)。 你现在可能不需要这个,但你会走得更远:)
如您所见,您可以轻松地使用该项目进行操作:

isset($_SESSION['cart'][$_POST['id']]); // check if the product exists
unset($_SESSION['cart'][$_POST['id']]); // remove the product
echo $_SESSION['cart'][$_POST['id']]['quantity']; // get the quantity.

代码中没有循环。你应该只在必要时使用循环,尽量避免它们,因为它们通常很慢。假设您的商店中有 1000 件商品的极端情况,您需要删除 no999...这需要很明显的时间。

【讨论】:

  • 感谢 Martinjn!我为我的例子不清楚而道歉。我真的很想完全掌握这一点。我做了以下,但项目 181 没有取消: $cart = array (181,33,129,34); var_dump($cart);未设置($cart[181]); var_dump($cart);然后,我做了这个,它确实没有设置。请帮助我了解更多。 $cart = 数组 (181,33,129,34); var_dump($cart);未设置($cart[0]); var_dump($cart);
  • 这个特定产品的 ID 是 42 吗?
  • 是的,42 是产品的示例 ID。如您所见,我使用 ID 作为值。
  • 我强烈建议您更新您的代码。你现在可能看不到这个,但从长远来看这会容易得多
  • 我致力于以最好的方式做到这一点,所以感谢您的意见。你的描述是合理和简洁的。我也喜欢灵活性。我不知道如何创建这样的数组。我试着看起来很接近。在这个论坛中我是否适合在此框中粘贴其他代码?你想看吗?该项目是直升机零件,并通过电子邮件向客户获取 ID 号,以匹配数据库并准备报价。它演变成购物车等。我喜欢避免循环并最大限度地使用 ID 来检查它是否存在以及删除和/或编辑。请指教
【解决方案2】:

这是正确执行此操作的代码:

$id = $_POST['id'];
$items = $_SESSION["cart"];
if(($key = array_search($id, $items)) !== false) {
    unset($items[$key]);
}
$_SESSION["cart"] = array_values($items);

建议

除了商品 ID,您还可以在 SESSION 数组中保存商品数量,因为用户可以将多次相同的商品添加到购物车中。在这种情况下,您的 $_SESSION["card"] 的结构应如下所示:

array(
    '1'=>12,//Item with ID=1 is added 12 times in shopping cart
    '17'=>2,//Item with ID=17 is added 2 times in shopping cart etc.
    '32'=>12,
)

【讨论】:

  • 谢谢 MrD!我将您的解决方案的应用解释如下: $id = $_POST['id']; // 从表单中获取 id $items = $_SESSION['cart']; if ( isset($items[$id] ) ) { unset($items[$id]); $_SESSION['cart'] = $items;如果我没有出错,它没有删除该项目。这是 SESSION['cart'] 的 var_dump 包含三个项目: array (size=3) 0 => string '181' (length=3) 1 => string '33' (length=2) 2 => string '34' (length=2) 我是否更正了删除 ID 181 是删除 $_SESSION['cart'][0] 而不是 $_SESSION['cart'][181]?
  • 你就是那个男人!它完美地工作!我将研究它以准确了解它是如何工作的。我的下一个挑战是数量变化。我将在 php.net 上阅读 array_search()。非常感谢您花时间提供帮助。谢谢MrD!
  • 没问题,我很高兴我能帮上忙。如果您的问题得到解决,并且我的回答是正确的,只需将其标记为正确;)
  • 因为这是标记的答案,人们经常停止阅读:虽然解决方案有效,但这不是要走的路。关注帖子的“建议”部分,或查看我的答案。 MrD 和我没有无缘无故地想出这个 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多