需要取消设置特定的会话数组

时间:2019-03-31 16:14:28

标签: php session multidimensional-array

我已经使用键值对将一个数组设置为会话变量,但是当我单击删除按钮时,需要取消设置该特定会话。

这是存储会话变量的代码:

$_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]);

1 个答案:

答案 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
        }
}


第五种方法是使用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创建一个平面数组。
该数组仅包含产品ID。
我使用array_diff仅返回与$ _GET [“ partid”]不匹配的项目。
我们得到的是只有productid的平面数组。听起来没什么用,确实如此,但是按键很有用。
键与会话数组中的键匹配。
因此,如果我们使用array_intersect_key并使用$ _SESSION ['product']作为主数组和来自array_diff的键,则输出是$ _SESSION ['product']中与$ _GET [“ partid”]不匹配的项。

背景复杂,但在衬里上很简单。