Reputation: 15
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
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
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