Pindo
Pindo

Reputation: 1625

deleting and changing values in multidimensional array php

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

Upvotes: 0

Views: 686

Answers (2)

Kuro
Kuro

Reputation: 868

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;

Upvotes: 0

billyonecan
billyonecan

Reputation: 20250

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

Upvotes: 1

Related Questions