删除和更改多维数组php中的值

时间:2013-10-23 07:41:25

标签: php arrays session multidimensional-array

我有以下代码在按下删除按钮时从数量中删除1,如果qty = 1,则该项目将从特定索引处的数组中删除。

例如,如果数组中的第一项具有ID为“1B”且数量为“5”且名称为“item1”,则数组中的第二项具有ID为“2B”且数量为“3”且名称为按下“item2”和此项目的删除按钮,数量将更改为2(根据需要),但ID将更改为1B,名称将更改为“item1”。如果$_SESSION["Cart"]数组中有两个以上的产品,则会发生同样的情况 我不知道我哪里出错了,但这是我的代码:

$_SESSION["Cart"]

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

删除项目的代码

$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

2 个答案:

答案 0 :(得分:1)

问题是你在每次迭代时分配$_SESSION['Cart'] = $cart,因此它只会包含$_SESSION['Cart']数组中的最后一项。如果您将其移到foreach末尾的下方,则代码应该可以正常工作。

您可以通过引用传递$cartItem来简化这一点。这样,您只能修改与$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

答案 1 :(得分:0)

您的代码存在一些算法/逻辑缺陷。此代码应该执行您需要它执行的操作。请试着找出它实际上做了什么,以及你的方法存在哪些缺陷。

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;