【问题标题】:Need to unset a specific session array需要取消设置特定的会话数组
【发布时间】:2019-03-31 16:14:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: php session multidimensional-array


    【解决方案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]);
        }
    }
    

    这里我们搜索是否有匹配的值,如果有我们删除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"] 不匹配的项目。

    背景很复杂,但很简单。

    【讨论】:

    • 您提到的所有方法都运行良好,但您认为实现这一目标的首选方法是什么?最简单的似乎是第四种方法....
    • 取决于您是否有多个项目需要删除。但是第四种方法很简单。当你需要时,最好开始使用引用循环。
    • 如果您只有一项需要删除,那么您可以在 foreach 内部的 unset 之后添加 break;
    猜你喜欢
    • 2011-10-05
    • 2019-03-15
    • 1970-01-01
    • 2015-10-10
    • 2016-11-30
    • 2021-07-15
    • 2015-10-08
    • 2014-04-03
    • 2015-08-24
    相关资源
    最近更新 更多