Удаление элементов из сеанса

У меня возникли проблемы с удалением элементов в массиве сеансов в проекте корзины покупок. Следующий код должен взять выбранный элемент и удалить его из сеанса. Однако конечным результатом является тот же сеанс, что и раньше, без каких-либо удалений. Я видел подобные проблемы в гугле, но пока не нашел рабочего решения. Вот урезанный код:

<?php
session_start();
$removeditem = $_GET['item']; // this identifies the item to be removed
unset($_SESSION['stuff'][$removeditem]); // "stuff" is the existing array in the session
?>

Вот что дает print_r для следующего (используя «7» в качестве примера удаленного элемента):

$removeditem: 
7

$_SESSION['stuff'] (before and after removal)
Array
(
    [0] => 7
    [1] => 24
    [2] => 36
)

Я упускаю что-то очевидное?


person funfetti    schedule 23.08.2010    source источник


Ответы (4)


Вы удаляете элемент с КЛЮЧОМ, равным $removedItem. Из вашего примера мне кажется, что вы пытаетесь удалить элемент, у которого ЗНАЧЕНИЕ равно removeItem. В этом случае вам нужно выполнить цикл foreach, чтобы определить ключ, а затем удалить его.

foreach($_SESSION['stuff'] as $k => $v) {
  if($v == $removeditem)
    unset($_SESSION['stuff'][$k]);
}
person Palantir    schedule 23.08.2010
comment
Ах да, ключ против ценности - это проблема. Работает как шарм. Спасибо за помощь! - person funfetti; 23.08.2010

Вам нужно сначала получить key элемента, а затем unset его. Вот код, который вы должны использовать:

if(($key = array_search($removeditem, $_SESSION['stuff'])) !== FALSE)
     unset($_SESSION['stuff'][$key]);
person shamittomar    schedule 23.08.2010

Самый простой способ:

<?php

    session_start();
    $removeditem = $_GET['item'];

    $temp = array_flip($_SESSION['stuff']);

    unset($_SESSION['stuff'][$temp[removeditem]]);

?>

P.S. Не проверял... просто концепт.

person Otar    schedule 23.08.2010

7 является значением в массиве, а не ключом, поэтому сброс чего-либо с помощью ключа 7 не поможет. Что вам нужно сделать, так это сравнить каждый элемент в массиве с тем, который вы хотите удалить ($_GET['item']), получить его ключ и отключить его.

person Hydrino    schedule 23.08.2010