我已经使用键值对将一个数组设置为会话变量,但是当我单击删除按钮时,需要取消设置该特定会话。
这是存储会话变量的代码:
$_SESSION['product'][] = array(
'product_id' => $part_id,
'title' => $title,
'price' => $price,
'default_img' => $default_img,
'quantity' => $quantity);
这是取消会话设置的代码:
if (isset($_POST['removeItem'])) {
$prodId=$_SESSION['prodItemId'];
foreach($_SESSION['product'] as $item) {
if ($_GET["partid"] == $item['product_id']) {
unset($_SESSION["product"]);
}
我遇到的问题是,它不仅取消了一个会话实例的设置,还取消了整个会话的设置。我已经尝试过unset($_SESSION["product"][$item]);
答案 0 :(得分:1)
您告诉代码取消设置整个会话,所以确实如此。
将密钥包括在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]);
}
}
我们在这里搜索是否存在匹配的值,如果我们删除了键,则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
}
}
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创建一个平面数组。
该数组仅包含产品ID。
我使用array_diff仅返回与$ _GET [“ partid”]不匹配的项目。
我们得到的是只有productid的平面数组。听起来没什么用,确实如此,但是按键很有用。
键与会话数组中的键匹配。
因此,如果我们使用array_intersect_key并使用$ _SESSION ['product']作为主数组和来自array_diff的键,则输出是$ _SESSION ['product']中与$ _GET [“ partid”]不匹配的项。
背景复杂,但在衬里上很简单。