从数组中删除项目


Remove an item from array

我正在使用PHP创建一个网上商店,并使用会话来保存临时项目。

<form method="post" action="basket.php">
  <table border="1" style="width:400px;">
    <tr>
      <td style="width:35%;">Product</td>
      <td style="width:30%;">Aantal</td>
      <td style="width:25%;">Totale prijs</td>
      <td style="width:10%;"></td>
    </tr>
    <?php
    for($i = 0; $i < count($_SESSION['basket']); $i++) {    
      $id     = $_SESSION['basket'][$i]['itemId'];
      $number = $_SESSION['basket'][$i]['number'];
      $result = $mysqli->query('SELECT * FROM items WHERE id = "' . $id . '"');
      $row    = $result->fetch_assoc();
      $total = $number * $row['price'];
      ?>
    <tr>
      <td>
        <a href="view_item.php?id=<?php echo $id; ?>">
          <?php echo $row['name']; ?>    
        </a>
      </td>
      <td><?php echo $number; ?></td>
      <td>&euro; <?php echo $total; ?></td>
      <td><input type="submit" name="removeItem[]" value="Verwijder" /></td>
    </tr>
    <?php
    if (isset($_POST['removeItem'])) {
      unset($_SESSION['basket'][$i]);
    }
    $_SESSION['basket'] = array_values($_SESSION['basket']);
  }
  ?>
  </table>
</form>

当我在会话中设置 3 个项目时。

Array
(
  [basket] => Array
    (
      [0] => Array
        (
          [itemId] => 1
          [number] => 1
          [timestamp] => 1380722942
        )
      [1] => Array
        (
          [itemId] => 1
          [number] => 1
          [timestamp] => 1380722944
        )
      [2] => Array
        (
          [itemId] => 1
          [number] => 1
          [timestamp] => 1380722945
        )
    )
)

并删除第二项,它也删除了最后一项。

出了什么问题?

有人可以帮助我吗?

您正在取消设置for循环内basket的 SESSION 变量。 因此,如果用户尝试删除第 2 项,则for循环将继续,之后的所有项也将取消设置。

取消设置正确的项目后,您应该退出for循环

if (isset($_POST['removeItem'])) {
    unset($_SESSION['basket'][$i]);
    break;
}

然后,您还想移动最后一行,

$_SESSION['basket'] = array_values($_SESSION['basket']);

for 循环之外,以便执行它。

编辑

经过仔细检查,我不确定为什么要在for循环取消设置 SESSION 变量,但我认为您需要重构代码。 断开for循环将解决删除多个项目的问题,但也会导致表不完整(删除的表之后basket中不会显示任何项目(。 您应该在与创建表不同的位置处理项目的删除。 我会将取消设置要删除的项目的 SESSION 变量移动到提交此表单时调用的操作。

尝试像这样删除。

array_splice($_SESSION['basket'], $i, 1);