您告诉代码取消设置整个会话,它确实如此。
在 foreach 中包含键并取消设置您需要取消设置的特定键。
foreach($_SESSION['product'] as $key => $item) {
if ($_GET["partid"] == $item['product_id']) {
unset($_SESSION["product"][$key]);
}
}
您还可以搜索特定值并跳过整个循环。
if (isset($_POST['removeItem'])) {
$prodId=$_SESSION['prodItemId'];
$key = array_search($_GET["partid"], array_column($_SESSION['product'], 'product_id'));
if($key !== false) unset($_SESSION["product"][$key]);
}
Array_search 搜索 GET partid,如果找到,则返回它所在位置的键,否则返回 false。
如果您有多个需要删除的数组项,上述 array_search 方法只会删除第一个。
但是,您可以循环 array_search 来获取它们。
if (isset($_POST['removeItem'])) {
$prodId=$_SESSION['prodItemId'];
$prodID = array_column($_SESSION['product'], 'product_id'); // creates a flat array that can be searched
while($key = array_search($_GET["partid"], $prodID)){
unset($_SESSION["product"][$key]);
}
}
这里我们搜索是否有匹配的值,如果有我们删除key,然后while循环再次搜索。
如果一个新的匹配值是 forum,它会被删除,如果不是,array_search 将返回 false 并打破 while 循环。
第四种方法是几乎保持原有代码不变,但通过引用 & 循环数组并取消设置项。
foreach($_SESSION['product'] as &$item) { // notice the &
if ($_GET["partid"] == $item['product_id']) {
unset($item); //because we used &, we can now unset $item
}
}
第五个方法是使用 array_diff 和 array_intersect。
这种方法是最慢的,不应该在较大的数组上使用,它可以在较小的数组(少于 50-100 个项目)上使用,差别很小。
if (isset($_POST['removeItem'])) {
$prodId=$_SESSION['prodItemId'];
$_SESSION['product'] = array_intersect_key($_SESSION['product'], array_diff(array_column($_SESSION['product'], 'product_id'), $_GET["partid"]));
}
为了解释它,由于它是嵌套的,因此我需要以与您阅读的内容“相反”的顺序来解释它。
我首先使用 array_column 创建了一个平面数组。
此数组仅包含 productid。
我使用 array_diff 仅返回与 $_GET["partid"] 不匹配的项目。
我们得到的是一个只有 productid 的平面数组。这听起来可能没用,确实如此,但按键很有用。
键与会话数组中的内容匹配。
因此,如果我们使用 array_intersect_key 并使用 $_SESSION['product'] 作为主数组和来自 array_diff 的键,那么输出是 $_SESSION['product'] 中与 $_GET["partid"] 不匹配的项目。
背景很复杂,但很简单。