Как удалить переменную из массива сессии в 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>
Я хочу удалить переменную, которая отображается в <code>$list2</code>
, из массива сессии, когда пользователь выбирает "Remove".
Но когда я вызываю unset
, из массива удаляются ВСЕ переменные.
Как я могу удалить только одну переменную?
5 ответ(ов)
Ваш код в PHP выглядит корректно. Давайте разберём его по частям.
Используется проверка, была ли отправлена форма с параметром
remove
:if (isset($_POST['remove'])) {
Затем производится поиск индекса элемента в массиве
$_SESSION['name']
, который соответствует значению, переданному через$_GET['name']
. Для этого используется функцияarray_search()
. Если элемент найден,array_search()
вернёт его индекс, иначе —false
.$key = array_search($_GET['name'], $_SESSION['name']);
Если индекс элемента не равен
false
, то с помощьюunset()
удаляется элемент с найденным индексом из массива$_SESSION['name']
:if ($key !== false) { unset($_SESSION['name'][$key]); }
После этого обновляется массив
$_SESSION['name']
, чтобы индексы элементов были последовательными. Это достигается с помощью функцииarray_values()
, которая переиндексирует массив:$_SESSION["name"] = array_values($_SESSION["name"]);
Таким образом, этот код удаляет заданное имя из сессии, если оно существует, и корректирует индексы массива, чтобы избежать дыр в индексации. Это особенно полезно, если вы планируете использовать массив $_SESSION['name']
в будущем, чтобы избежать путаницы с отсутствующими индексами.
Сначала отвечу на ваш вопрос по поводу переменной $_SESSION['name']
: эта переменная не обязательно является массивом; она может содержать любое значение, включая строку, число, массив и т.д. Если вам нужно удалить конкретный элемент из массива, находящегося в этой переменной (если он является массивом), вы должны указать точный ключ при вызове функции unset()
. В противном случае вы удалите весь массив, например:
$name = array(0 => 'a', 1 => 'b', 2 => 'c');
unset($name); // удаляет весь массив
unset($name[1]); // удаляет только элемент 'b'
Еще один момент в вашем коде: вы смешиваете параметры GET-запроса с POST-формами. Есть ли какая-то причина, по которой вы не можете передать значение 'name' в скрытом поле формы? Лучше избегать смешивания переменных GET и POST, особенно если вы используете $_REQUEST
в других частях вашего кода. Вы можете столкнуться с проблемами, пытаясь понять, почему $_GET['name']
не отображается так же, как $_POST['name']
, особенно если у сервера установлена другая последовательность EGPCS в настройке 'variables_order' в конфигурационном файле .ini
.
Вот пример корректного использования скрытого поля:
<form method="post">
<input type="hidden" name="name" value="<?= htmlspecialchars($list1) ?>" />
<input type="submit" name="add" value="Add" />
</form>
Обратите внимание на вызов htmlspecialchars()
. Если переменные $list1
или $list2
содержат двойные кавычки ("), это может сломать ваш HTML-код.
Если вы хотите удалить или сбросить все переменные сессии, попробуйте это:
session_destroy();
Если вы хотите удалить конкретную переменную сессии, например $_SESSION['name']
, используйте следующий код:
unset($_SESSION['name']);
Обратите внимание, что функция session_unset()
без параметров удаляет все переменные сессии, но для удаления конкретной переменной лучше использовать unset()
.
Вам нужно правильно использовать функцию unset()
для удаления элементов массива. Чтобы удалить конкретный элемент массива, вы должны указать имя массива и индекс элемента, который хотите удалить. Например:
$ar[0] == 2;
$ar[1] == 7;
$ar[2] == 9;
unset($ar[2]); // Удаляет элемент с индексом 2.
Кроме того, можно использовать два подхода для удаления значений из массива:
- Удаление по ключу:
function array_remove_key() {
$args = func_get_args();
return array_diff_key($args[0], array_flip(array_slice($args, 1)));
}
- Удаление по значению:
function array_remove_value() {
$args = func_get_args();
return array_diff($args[0], array_slice($args, 1));
}
Вот пример, как это работает:
<?php
$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>';
// Удаляем элементы по ключу:
$fruit_inventory = array_remove_key($fruit_inventory, "beets", "carrots");
echo "<pre>Array after key removal:\n",
print_r($fruit_inventory, TRUE),
'</pre>';
// Удаляем элементы по значению:
$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()
не влияет на внутренний счётчик массива, поэтому, несмотря на удаление элемента, ключи не будут переупорядочены. Чтобы сохранить индексный порядок, лучше всего использовать array_values()
после удаления элементов. Важно также помнить, что это поведение может повлиять на дальнейшую обработку массива.
Дополнительную информацию можно найти в официальной документации PHP.
Ваш код выполняет проверку на наличие значения, переданного через $_GET['name']
, в массиве $_SESSION['name']
. Если значение найдено, оно удаляется из массива. Вот перевод кода и объяснение:
if (FALSE !== ($key = array_search($_GET['name'], $_SESSION['name']))) {
unset($_SESSION['name'][$key]);
}
Объяснение:
array_search()
: Эта функция ищет значение$_GET['name']
в массиве$_SESSION['name']
. Она возвращает ключ первого найденного элемента илиFALSE
, если значение не найдено.if (FALSE !== ($key = ...))
: Эта проверка нужна для того, чтобы убедиться, что значение найдено в массиве. Еслиarray_search()
возвращаетFALSE
, это значит, что значение не было найдено, и дальнейшие действия не выполняются.unset($_SESSION['name'][$key]);
: Если значение найдено,unset()
удаляет элемент массива по найденному ключу$key
.
Заключение:
Этот код эффективно удаляет конкретное имя из массива сессии, если оно там существует. Не забудьте убедиться, что сессия была начата с помощью session_start()
, прежде чем вызывать этот код, иначе $_SESSION
не будет доступен.
Преобразование объекта PHP в ассоциативный массив
Как добавить элементы в пустой массив в PHP?
Вставка нового элемента в массив в любом месте в PHP
Сортировка массива объектов по одному свойству
Отправка многомерного массива с помощью PHP и CURL