Как удалить переменную из массива сеансов PHP

У меня есть PHP-код, который используется для добавления переменных в сеанс:

<?php session_start(); if(isset($_GET['name'])) { $name = isset($_SESSION['name']) ? $_SESSION['name'] : array(); $name[] = $_GET['name']; $_SESSION['name'] = $name; } if (isset($_POST['remove'])) { unset($_SESSION['name']); } ?> <pre> <?php print_r($_SESSION); ?> </pre> <form name="input" action="index.php?name=<?php echo $list ?>" method="post"> <input type="submit" name ="add"value="Add" /> </form> <form name="input" action="index.php?name=<?php echo $list2 ?>" method="post"> <input type="submit" name="remove" value="Remove" /> </form> 

Я хочу удалить переменную, которая отображается в $list2 из массива сеансов, когда пользователь выбирает «Удалить».

Но когда я отключаюсь, ВСЕ переменные в массиве удаляются.

Как я могу удалить только одну переменную?

 if (isset($_POST['remove'])) { $key=array_search($_GET['name'],$_SESSION['name']); if($key!==false) unset($_SESSION['name'][$key]); $_SESSION["name"] = array_values($_SESSION["name"]); } с if (isset($_POST['remove'])) { $key=array_search($_GET['name'],$_SESSION['name']); if($key!==false) unset($_SESSION['name'][$key]); $_SESSION["name"] = array_values($_SESSION["name"]); } 

Поскольку $_SESSION['name'] – это массив, вам нужно найти ключ массива, который указывает на интересующее вас имя. Последняя строка перестраивает индекс массива для следующего использования.

Чтобы удалить определенную переменную из сеанса, используйте:

 session_unregister('variableName'); 

( см. документацию ) или

 unset($_SESSION['variableName']); 

ПРИМЕЧАНИЕ. session_unregister() был DEPRECATED с PHP 5.3.0 и удалены с PHP 5.4.0.

Является ли переменная $ _SESSION ['name'] массивом? Если вы хотите удалить определенный ключ из массива, вы должны обратиться к этому точному ключу в вызове unset (), иначе вы удалите весь массив, например

 $name = array(0 => 'a', 1 => 'b', 2 => 'c'); unset($name); // deletes the entire array unset($name[1]); // deletes only the 'b' entry с $name = array(0 => 'a', 1 => 'b', 2 => 'c'); unset($name); // deletes the entire array unset($name[1]); // deletes only the 'b' entry 

Еще одна небольшая проблема с вашим фрагментом: вы смешиваете параметры запроса GET с формой POST. Есть ли причина, по которой вы не можете делать формы с «именем», передаваемым в скрытом поле? Лучше не смешивать переменные get и post, особенно если вы используете $ _REQUEST в другом месте. Вы можете столкнуться со всеми видами забавы, пытаясь понять, почему $ _GET ['name'] не отображается так же, как $ _POST ['name'], потому что у сервера есть отличный набор настроек EGPCS в 'variables_order' .ini.

 <form blah blah blah method="post"> <input type="hidden" name="name" value="<?= htmlspecialchars($list1) ?>" /> <input type="submit" name="add" value="Add /> </form> 

Обратите внимание на вызов htmlspecialchars (). Если либо $ list1, либо $ list2 содержат двойную кавычку ("), это нарушит ваш HTML-код

В настоящее время вы очищаете массив имен, вам нужно вызвать массив, а затем индекс, который вы хотите отключить в массиве:

 $ar[0]==2 $ar[1]==7 $ar[2]==9 unset ($ar[2]) 

Два способа сброса значений внутри массива:

 <?php # remove by key: function array_remove_key () { $args = func_get_args(); return array_diff_key($args[0],array_flip(array_slice($args,1))); } # remove by value: function array_remove_value () { $args = func_get_args(); return array_diff($args[0],array_slice($args,1)); } $fruit_inventory = array( 'apples' => 52, 'bananas' => 78, 'peaches' => 'out of season', 'pears' => 'out of season', 'oranges' => 'no longer sold', 'carrots' => 15, 'beets' => 15, ); echo "<pre>Original Array:\n", print_r($fruit_inventory,TRUE), '</pre>'; # For example, beets and carrots are not fruits... $fruit_inventory = array_remove_key($fruit_inventory, "beets", "carrots"); echo "<pre>Array after key removal:\n", print_r($fruit_inventory,TRUE), '</pre>'; # Let's also remove 'out of season' and 'no longer sold' fruit... $fruit_inventory = array_remove_value($fruit_inventory, "out of season", "no longer sold"); echo "<pre>Array after value removal:\n", print_r($fruit_inventory,TRUE), '</pre>'; ?> 

Таким образом, unset не влияет на счетчик внутренних массивов !!!

http://us.php.net/unset

Если вы хотите удалить или удалить все $ _SESSION, попробуйте это

 session_destroy(); 

Если вы хотите удалить конкретную $ _SESSION ['name'], попробуйте это

 session_unset('name'); 

Попробуй это:

 if(FALSE !== ($key = array_search($_GET['name'],$_SESSION['name']))) { unset($_SESSION['name'][$key]); } с if(FALSE !== ($key = array_search($_GET['name'],$_SESSION['name']))) { unset($_SESSION['name'][$key]); }