首页 > 解决方案 > 为什么每次尝试向数组中添加内容时都会覆盖当前数据?

问题描述

我目前正在尝试使用 PHP 处理网站的购物车对象。我有跨多个网页持久存在的购物车对象。

每当我向购物车添加东西时,我首先检查该对象是否存在,如果它不存在,我会将它添加到项目数组中,但如果它确实存在,我将简单地更新数量现有项目。

然而,这种情况并非如此。每当我尝试向购物车添加东西时,我的程序都无法识别出购物车中已经有一个对象。此外,如果购物车中没有东西,它会将其添加到购物车中,但是它会删除其中已经存在的内容并添加然后替换。

您可以在下面找到我检查它是否存在并添加它的代码:

    public function obj_exists($item_id){
        for($i=0;$i<$this->count;$i++){
            if($this->items[$i]->getID()==(int)$item_id){
                return $i;
            }
        }
        return -1;
    }
    
    public function addToCart($item_id, $quantity){
        $existing=$this->obj_exists($item_id);
        echo $existing;
        if(is_numeric($item_id) && is_numeric($quantity) && $quantity>=1){
            if($existing==-1){  
                $newItem=new CartItem();
                $newItem->setQuant($quantity);
                $newItem->setID($item_id);
                $this->items[]=$newItem;
                $this->count++;
            } else {
                $this->items[$existing]->increment();
            }
        } else if (is_numeric($item_id) && is_numeric($quantity)) {
            echo "Invalid quantity";
        }
    }

这是我在我的 cart_handler.php 中调用 addToCart 方法的地方:

$serialized=$_SESSION['user_cart'];
$cartobj=new ShoppingCart();
$cartobj->__unserialize($serialized);
$cartobj->addToCart($new_item_id, 1);

$_SESSION['user_cart']=$cartobj->__serialize();
header('Location: http://localhost/website/heroku/order.php');
exit();

以防万一有人问,这是我的序列化和反序列化方法:

    public function serialize_items() {
        $serialized=array();
        foreach($this->items as $item) {
            $serialized[]=$item->__serialize();
        }
        return $serialized;
    }

    public function __serialize() {
        return [
            'count'=>$this->count,
            'items'=>$this->serialize_items()
        ];
    }

    public function unserialize_items(array $data) {
        $unserialized=array();
        foreach($data as $item){
            $tmpItem=new CartItem();
            $tmpItem->unserialize($item);
            $unserialized[]=$tmpItem;
        }
        return $unserialized;
    }

    public function __unserialize(array $data) {
        $this->count=$data[0];
        if(!is_null($data[1])){
            $this->items=$this->unserialize_items($data[1]);
        }
    }

标签: phphtmlarraysserialization

解决方案


推荐阅读