0

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

16

У меня есть код на 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 ответ(ов)

0

Ваш код в PHP выглядит корректно. Давайте разберём его по частям.

  1. Используется проверка, была ли отправлена форма с параметром remove:

    if (isset($_POST['remove'])) {
    
  2. Затем производится поиск индекса элемента в массиве $_SESSION['name'], который соответствует значению, переданному через $_GET['name']. Для этого используется функция array_search(). Если элемент найден, array_search() вернёт его индекс, иначе — false.

    $key = array_search($_GET['name'], $_SESSION['name']);
    
  3. Если индекс элемента не равен false, то с помощью unset() удаляется элемент с найденным индексом из массива $_SESSION['name']:

    if ($key !== false) {
        unset($_SESSION['name'][$key]);
    }
    
  4. После этого обновляется массив $_SESSION['name'], чтобы индексы элементов были последовательными. Это достигается с помощью функции array_values(), которая переиндексирует массив:

    $_SESSION["name"] = array_values($_SESSION["name"]);
    

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

0

Сначала отвечу на ваш вопрос по поводу переменной $_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-код.

0

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

session_destroy();

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

unset($_SESSION['name']);

Обратите внимание, что функция session_unset() без параметров удаляет все переменные сессии, но для удаления конкретной переменной лучше использовать unset().

0

Вам нужно правильно использовать функцию unset() для удаления элементов массива. Чтобы удалить конкретный элемент массива, вы должны указать имя массива и индекс элемента, который хотите удалить. Например:

$ar[0] == 2;
$ar[1] == 7;
$ar[2] == 9;

unset($ar[2]); // Удаляет элемент с индексом 2.

Кроме того, можно использовать два подхода для удаления значений из массива:

  1. Удаление по ключу:
function array_remove_key() {
    $args = func_get_args();
    return array_diff_key($args[0], array_flip(array_slice($args, 1)));
}
  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.

0

Ваш код выполняет проверку на наличие значения, переданного через $_GET['name'], в массиве $_SESSION['name']. Если значение найдено, оно удаляется из массива. Вот перевод кода и объяснение:

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

Объяснение:

  1. array_search(): Эта функция ищет значение $_GET['name'] в массиве $_SESSION['name']. Она возвращает ключ первого найденного элемента или FALSE, если значение не найдено.

  2. if (FALSE !== ($key = ...)): Эта проверка нужна для того, чтобы убедиться, что значение найдено в массиве. Если array_search() возвращает FALSE, это значит, что значение не было найдено, и дальнейшие действия не выполняются.

  3. unset($_SESSION['name'][$key]);: Если значение найдено, unset() удаляет элемент массива по найденному ключу $key.

Заключение:

Этот код эффективно удаляет конкретное имя из массива сессии, если оно там существует. Не забудьте убедиться, что сессия была начата с помощью session_start(), прежде чем вызывать этот код, иначе $_SESSION не будет доступен.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь