PHP数组数据未更新

PHP数组数据未更新,php,arrays,session,Php,Arrays,Session,任务是让一个表显示一些带有“添加到购物车”链接的产品,该链接将用户发送到另一个页面,该页面使用链接中的信息获取数据以显示购买总额。该表正在添加已单击的新项目,但在多次单击项目时不更新实际数量 我已经尝试在检查中放置一个回音,用于检查已经在购物车中的商品,它确实在数量更新之前声明了数量1,在更新之后声明了数量2,但由于某些原因,这实际上并没有更新。价格也是如此 <?php session_start(); if(empty($_SESSION['cart'])) { $_

任务是让一个表显示一些带有“添加到购物车”链接的产品,该链接将用户发送到另一个页面,该页面使用链接中的信息获取数据以显示购买总额。该表正在添加已单击的新项目,但在多次单击项目时不更新实际数量

我已经尝试在检查中放置一个回音,用于检查已经在购物车中的商品,它确实在数量更新之前声明了数量1,在更新之后声明了数量2,但由于某些原因,这实际上并没有更新。价格也是如此

<?php
  session_start();
  if(empty($_SESSION['cart'])) {
      $_SESSION['cart'] = array();
  }

  $cart = $_SESSION['cart'];

  $id = $_GET['productid'];
  $name = $_GET['productname'];
  $price = $_GET['productprice'];
  $qty = 1;
  $alreadyHas = 0;

  foreach($cart as $cartKey => $cartItem) {
      if(!empty($cartItem['pid'])) {
        if($cartItem['pid'] == $id) {
            $cartItem['qty'] = $cartItem['qty'] + 1;
            $cartItem['total'] = $cartItem['price'] * $cartItem['qty'];
            $alreadyHas = 1;
        }
      }
  }
  if($alreadyHas == 0) {
    $cartItem = array(
        'pid' => $id,
        'name' => $name,
        'price' => $price,
        'qty' => $qty,
        'total' => $price
      );
      array_push($cart, $cartItem);
  }

  $_SESSION['cart'] = $cart;
?>

您的问题在您的
foreach
循环中。您正在更新
$cartitem
,但是,由于您没有在循环中通过引用传递它,
$cart
变量本身没有被更新。尝试将
foreach
循环更改为此(注意在“$cartItem”之前添加了
&
):

请注意,您可以使用和简化代码:


您的问题在
foreach
循环中。您正在更新
$cartitem
,但是,由于您没有在循环中通过引用传递它,
$cart
变量本身没有被更新。尝试将
foreach
循环更改为此(注意在“$cartItem”之前添加了
&
):

请注意,您可以使用和简化代码:


另一种可选语法是,您可以为分配编写
$cart[$cartKey]['qty']=…
。这两种语法都同样有效。另一种可选语法可以为您的作业编写
$cart[$cartKey]['qty']=…
。两者同等有效。
foreach($cart as $cartKey => &$cartItem) {
if (($k = array_search($id, array_column($cart, 'pid'))) !== false) {
    $cart[$k]['qty'] = $cart[$k]['qty'] + 1;
    $cart[$k]['total'] = $cart[$k]['price'] * $cart[$k]['qty'];
}
else {
    $cartItem = array(
        'pid' => $id,
        'name' => $name,
        'price' => $price,
        'qty' => $qty,
        'total' => $price
      );
      array_push($cart, $cartItem);
}