从数组中删除项目

时间:2013-10-02 14:11:50

标签: php

我正在创建一个使用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
        )
    )
)

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

出了什么问题?

有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

修改

经过仔细检查后,我不确定你为什么要在for循环中取消内部的SESSION变量,但我认为你需要重构你的代码。打破for循环可以解决您的问题,即删除了多个项目,但也会导致您的表格不完整(在您移除的项目显示后,basket中没有项目)。您应该在创建表的单独位置处理项目的删除。我会移动取消您要删除的项目的SESSION变量到您提交此表单时调用的操作。

答案 1 :(得分:0)

尝试像这样删除。

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