从购物车数组中删除一个项目



我正在构建一个购物车,我将订单保存在一个多维数组中,该数组存储在会话$_SESSION['cart']

产品用类似

的东西表示
$product_array=array($id,$description,$price);

多维数组是$product_array.s

的数组。

$id's是唯一的

问题是,当我想从多维$_SESSION['cart']中删除产品时数组基于id,它工作,如果它只是一个项目在购物车中,但如果更多,它不工作,项目似乎被删除,但它的"鬼"留在购物车。的代码是这样的:

//get $id, $count is elements in array  
for ($r = 0; $r <= $count-1; $r++) 
{
   if($_SESSION['cart'][$r][0]=="$id")
   {
 unset($_SESSION['cart'][$r]); 
 echo "<div class=success>The item has been removed from your shopping cart.</div>";
 break;
   }
}

试试这个函数,它为我工作

function remove_product($id){
$id=intval($id);
$max=count($_SESSION['cart']);
for($i=0;$i<$max;$i++){
if($id==$_SESSION['cart'][$i]['id']){
unset($_SESSION['cart'][$i]);
break;
}
}
$_SESSION['cart']=array_values($_SESSION['cart']);
if($_REQUEST['command']=='delete' && $_REQUEST['id']>0){
remove_product($_REQUEST['id']);
}
else if($_REQUEST['command']=='clear'){
unset($_SESSION['cart']);
}
else if($_REQUEST['command']=='update'){
$max=count($_SESSION['cart']);
for($i=0;$i<$max;$i++){
$id=$_SESSION['cart'][$i]['id'];
$q=intval($_REQUEST['qty'.$id]);
if($q>0 && $q<=999){
$_SESSION['cart'][$i]['qty']=$q;
}
else{
$msg='Some proudcts not updated!, quantity must be a number between 1 and 999';
}
}
}

检查php.conf中的register_global是否为on。尝试使用以下语法来取消设置:

   if($_SESSION['cart'][$r][0]=="$id") {
     $_SESSION['cart'][$r] = NULL;// this is just to be sure =)
     unset($_SESSION['cart'][$r], $cart[$r]); 
     echo "<div class=success>The item has been removed from your shopping cart.</div>";
     break;
   }

下面的代码可以工作,也许它会帮助你找到你的错误:

session_start();
$i=0;
$_SESSION['cart'][]=array($i++,'sds',99);
$_SESSION['cart'][]=array($i++,'sds',100);
$_SESSION['cart'][]=array($i++,'sds',20);
$_SESSION['cart'][]=array($i++,'sds',10);
$id = 2;
$count = count($_SESSION['cart']);
for ($r=0;$r<$count;$r++)
{
    echo "num=$r<br>";
    if(isset($_SESSION['cart'][$r]) && $_SESSION['cart'][$r][0]==$id)
    {
        unset($_SESSION['cart'][$r]);
        echo "The item has been removed from your shopping cart.<br>";
        break;
    }
}
session_write_close();

如前所述,我认为这个问题与数组的布局以及您在for循环或某些PHP设置中尝试检查的内容有关。例如,您是否启动了会话?我可能会转而使用产品引用数组。使用普通数组很快就会变成一场噩梦,你可能会在没有任何警告的情况下意外地引用错误的对象。用格式良好的函数名获取的封装对象有助于避免这种情况。就像

$cart = array($productId => $quantity, $productId2 => $quantityOfSecondProduct);

然后是包含所有产品信息数据的数组

$products = array($product1...);

,其中每个产品的类型为

class Product
{
  $productId;
  $productName;
  $productDescription;
  ... etc
}

然后你有所有的数据分开,但很容易访问,你可以删除一个或多个条目在购物车中基于产品id很容易,但只是引用它,并删除如果数量为0。

if(($cart[$productId] - $quantityToRemove) <= 0)
  unset($cart[$productId]);
else
  $cart[$productId] -= $quantityToRemove;

请注意,填充产品等应该最好从一些数据源完成,我也会把整个购物车作为一个类,有很好的函数和一点更多的错误检查应该在适当的地方;)

相关内容

  • 没有找到相关文章