【问题标题】:Removing an item from shopping cart array从购物车数组中删除一个项目
【发布时间】:2013-03-11 22:51:52
【问题描述】:

我正在构建一个购物车,我将订单保存在一个多维数组中,该数组存储在会话中,$_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;
   }
}

【问题讨论】:

  • 您在 if 条件中使用了break;,因此它正在终止循环。
  • @Rikesh:他的想法是,如果他找到了具有正确 id 的项目,则使用 break 来停止循环。
  • 相同的结果没有中断,id是唯一的,所以应该只有一个匹配的结果。谢谢。
  • @bodesam - 我认为我们需要更多说明您究竟想要实现什么。
  • 产品由类似的东西表示...我认为我们需要确切地知道它的外观。我认为您在数组布局以及在 for 循环中检查的内容存在问题。

标签: php session multidimensional-array


【解决方案1】:

试试这个功能,它对我有用

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';
}
}
}

【讨论】:

  • 哇哦,现在加上 $_SESSION['cart']=array_values($_SESSION['cart']); array_values() 函数可以解决问题。我认为问题与会话持久性有关,可以这么说。谢谢。
【解决方案2】:

检查您的 php.conf 中是否启用了 register_global。尝试使用以下语法来取消两者:

   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;
   }

【讨论】:

  • PS:别忘了把session_start();放在开头。
【解决方案3】:

以下代码有效,也许它会帮助您找到您的问题:

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();

【讨论】:

    【解决方案4】:

    如前所述,我认为问题与您的数组布局以及您尝试在 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;
    

    请注意,最好从某些数据源填充产品等,我也会将整个购物车作为一个具有很好功能的类,并且应该进行更多的错误检查;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2013-01-11
      相关资源
      最近更新 更多