Ray
Ray

Reputation: 15

Determine if new cart entry contains same identifiers as an entry already in the cart/SESSION

I have a function that adds custom built cameos in a cart. The cart is stored in a session variable. If the customer decides to build the very same cameo I don't want to add another entry to the array I just want to be able to add 1 more to the quantity of said product. The problem is when the scripts reaches the point where it's checking to see if the values exist in the array it returns false and adds a new entry to the array. I am fairly new to PHP so I'm not sure if I am going about it the right way.

function AddToCart($subpid,$subtype,$subprice,$subtotal,$subcarving,$subline1,$subline2){
    global $form;
    
    $exist = false;
    $i=0;
    
    if(!isset($_SESSION['cart'])){
        $_SESSION['cart'] = array(0 => array("Product ID" => $subpid, "Type" => $subtype, "Price" => "$".$subprice, "Subtotal" => "$".$subtotal, "Carving" => $subcarving, "Line 1" => $subline1, "Line 2" => $subline2, "Quantity" => 1));
    }
    else{
        foreach($_SESSION['cart'] as $item){
            $i++;
            while(list($key,$value) = each($item)){
                /* If product exist add 1 to quantity */
                if($key == "Product ID" && $value == $subpid && $key == "Type" && $value == $subtype && $key == "Price" && $value == "$".$subprice && $key == "Subtotal" && $value == "$".$subtotal  && $key == "Carving" && $value == $subcarving && $key == "Line 1" && $value == $subline1 && $key == "Line 2" && $value == $subline2){
                    array_splice($_SESSION['cart'], $i-1, 1, array(array("Product ID" => $subpid, "Type" => $subtype, "Price" => "$".$subprice, "Subtotal" => "$".$subtotal, "Carving" => $subcarving, "Line 1" => $subline1, "Line 2" => $subline2, "Quantity" => $item['Quantity'] + 1)));
                    $exist = true;
                }
            }
        }
        if($exist == false){
            array_push($_SESSION['cart'], array("Product ID" => $subpid, "Type" => $subtype, "Price" => "$".$subprice, "Subtotal" => "$".$subtotal, "Carving" => $subcarving, "Line 1" => $subline1, "Line 2" => $subline2, "Quantity" => 1));
        }
    }
    return 0;
}

If I was to just use: $key == "Product ID" && $value == $subid it will return true and update the quantity but the problem with that is if the customer buys two cameo with the same id but different carving on it or engravings my cart will be off.

Upvotes: 0

Views: 285

Answers (2)

Rick Kukiela
Rick Kukiela

Reputation: 1264

I think you're making this way more confusing than it has to be...

I would set up your cart array like this:

$cart[0]["name"] = "whatever";
$cart[0]["ProductID"] = "1234";
$cart[0]["price"] = 0.00;
$cart[0]["quantity"] = 1;
$cart[0]["options"] = array(
     "subcarving" => "asdf",
     "subline1"   => "asdfsafd",
     "subline2"   => "asfdsadfdf");

Then you could just handle it with easy looping like so:

$didadd = 0;
for($x = 0; $x < sizeof($cart); $x++) {
    if($subid == $cart[$x]["ProductID"]) {
        // check options
        $sameOpts = 1;
        foreach($cart[$x]["options"] as $key => $val) {

            if($val != ${$key}) { // checks if the current items option[val] = function(val)
                $sameOpts = 0;
            }

        }

        if($sameOpts) {
            $didadd = 1; // sets the flag that we added the element.
            // increase quantity since the product id and options matched.

        } else {
            $didadd = 1;
            // add new element
            // sets the flag that we added the element
        }

    }
} 

if(!$didadd) { 
    // still need to add the item
    // do code to create new $cart item here.

}

Upvotes: 2

Cfreak
Cfreak

Reputation: 19309

It doesn't work because you are comparing each key at the same time with the && statement but you're looping through each one of your keys one at a time. Take out the while loop and just compare it like this:

if( $item['Product ID'] == $subpid ... //etc ) {

}

Also you don't need array_splice just update the items.

Upvotes: 0

Related Questions