Нужно сбросить определенный массив сессий - PullRequest
2 голосов
/ 31 марта 2019

Я установил массив для переменной сеанса, используя пары ключ-значение, но мне нужно сбросить этот конкретный сеанс, когда я нажимаю кнопку удаления.

Это код, который хранит переменные сеанса:

$_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 Ответ

1 голос
/ 31 марта 2019

Вы говорите коду, чтобы сбросить весь сеанс, так оно и есть.

Включите ключ в 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 и, если она найдена, возвращает ключ того, где она находится, в противном случае возвращает ложь.


Если у вас есть несколько элементов массива, которые необходимо удалить, вышеуказанный метод 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.
Этот массив содержит только продукты.
Я использую array_diff для возврата только тех элементов, которые не соответствуют $ _GET ["partid"].
То, что мы получаем - это плоский массив только с продукцией. Это может показаться бесполезным, и это так, но ключи полезны.
Ключи соответствуют тому, что находится в массиве сеанса.
Поэтому, если мы используем array_intersect_key и используем $ _SESSION ['product'] в качестве основного массива и ключи из array_diff, то на выходе получаются элементы в $ _SESSION ['product'], которые не соответствуют $ _GET ["partid"].

Сложно в фоновом режиме, но просто на вкладыше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...