我有一个购物车类,我可以存储相同的产品ID,其中包含多个属性,例如同一产品的不同尺寸。但是,当我的数组中有多个项目具有相同的产品ID并逐个删除时,我发现有时1或2个项目无法从阵列中删除。我可以删除一些项目但不是全部。
按钮删除项目
<div class="removebtn" data-id="'.$id.'" data-qty="'.$item['quantity'].'" data-price="'.((isset($item['attributes']['price'])) ? $item['attributes']['price'] : '').'" data-size="'.((isset($item['attributes']['size'])) ? $item['attributes']['size'] : '').'" >
删除项目
的ajax$('.removebtn').on('click', function(){
var $btn = $(this);
var id = $btn.attr('data-id');
var size = $btn.attr('data-size');
var price = $btn.attr('data-price');
var qty = $btn.attr('data-qty');
var action = "remove";
$.ajax ({
method: 'post',
url: 'mycart.php',
data: {
id: id,
size:size,
action: action,
price:price,
qty:qty
},
funciton to remove
/**
* Remove item from cart.
*
* @param string $id
* @param array $attributes
*
* @return bool
*/
public function remove($id, $attributes = [])
{
if (!isset($this->items[$id])) {
return false;
}
if (empty($attributes)) {
unset($this->items[$id]);
$this->write();
return true;
}
$hash = md5(json_encode(array_filter($attributes)));
$index = 0;
foreach ($this->items[$id] as $item) {
if ($item['hash'] == $hash) {
unset($this->items[$id][$index]);
$this->write();
return true;
}
++$index;
}
return false;
}
mycart.php
if ($_POST["action"] == 'remove') {
$cart->remove($_POST['id'],[
'price' => $_POST['price'],
'size' => (isset($_POST['size'])) ? $_POST['size'] : '',
]);
}
答案 0 :(得分:0)
你应该使用foreach循环中的键,而不是自己计算,因为unset会留下空白点。
$array = [1,2,3];
unset($array[1]);
此时,$array[1]
未设置,因此您的手动计数不起作用。所以只需使用此
foreach ($this->items[$id] as $index => $item) {
...
}
除此之外,计算哈希的方式看起来不是很强大,并且强烈依赖于输入数组的顺序。我也会改变这个......