0

I've got the following code to remove 1 from the qty when a remove button is pressed and if the qty=1 the item will be removed from the array at the specific index.

for example if the first item in the array has an ID of '1B' and qty of '5' and name 'item1' second item in the array has the ID of '2B' and qty of '3' and name 'item2' and the remove button for this item is pressed, the qty will change to 2(as required) but the id will change to 1B and the name to 'item1'. The same thing happens if there are more than 2 products in the $_SESSION["Cart"] array.
I'm not sure where i'm going wrong, but this is my code:

code for $_SESSION["Cart"]

$_SESSION["Cart"] = array(
            array(
                'name' => "namehere",
                'id' => "idHere",
                'qty' => 1,
                'price' => "pricehere"
            )
//more arrays here
        );

Code for Removing item

$prodID    = $_GET["removeProd"];
foreach ($_SESSION["Cart"] as $cartItem) {
        //only continue if qty is more than one
        //remove item if 0 qty
        if ($cartItem["id"] == $prodID) {
            if ($cartItem["qty"] > 1) {
                $qty       = $cartItem["qty"] - 1; //decrease qty by one
                $cart[] = array(
                    'name' => $cartItem["name"],
                    'id' => $cartItem["id"],
                    'qty' => $qty,
                    'price' => $cartItem["price"]
                );
            } //end if
        } else {
            $cart[] = array(
                'name' => $cartItem["name"],
                'id' => $cartItem["id"],
                'qty' => $cartItem["qty"],
                'price' => $cartItem["price"]
            );
        } //end else
        $_SESSION["Cart"] = $cart;
    } //end foreach
1
  • What's your question? Commented Oct 23, 2013 at 7:51

2 Answers 2

1

The problem is that you're assigning $_SESSION['Cart'] = $cart on each iteration, so it will only ever contain the last item in the $_SESSION['Cart'] array. If you move it below the end of the foreach your code should work.

You could simplify this a bit by passing $cartItem by reference. That way you only modify array elements which match $prodID:

foreach ($_SESSION['Cart'] as $key => &$cartItem) {
  if ($cartItem['id'] == $prodID) {
    if ($cartItem['qty'] > 1) {
      $cartItem['qty'] -= 1;
    } else { 
      unset($_SESSION['Cart'][$key]); 
    }
  }
}
unset($cartItem); // break the binding
Sign up to request clarification or add additional context in comments.

Comments

0

Your code has some algorhithmic/logic flaws. This code should do what you need it to do. Please try to find out what it actually does, and where are the flaws in your approach.

foreach ($_SESSION["Cart"] as $key=>$cartItem) {
    //only continue if qty is more than one
    //remove item if 0 qty
    if ($cartItem["id"] == $prodID) {
        if ($cartItem["qty"] > 1) {
            $qty = $cartItem["qty"]--;// does the same thing as x = x - 1; //decrease qty by one
            $cart[$key]['qty'] = $qty;

        } //end if
        else {
            unset($cart[$key]);
        }
        break;// ends foreach loop ( assuming there can be only one item of the same type in the cart )
    } 
} //end foreach

$_SESSION["Cart"] = $cart;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.