Дублирование массива сеансов PHP

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

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

Array ( [0] => pig[1] => cow[2] => sheep[3] => chicken[4] => pig[5] => cow[6] => sheep[7] => dog)

Что я хочу это:

Array ( [0] => pig[1] => cow[2] => sheep[3] => chicken[4] => dog[5])

Что я делаю неправильно?

index.php

<?php
session_start();
//pre-defined list of animals
$_SESSION['animals'][] = 'pig';
$_SESSION['animals'][] = 'cow';
$_SESSION['animals'][] = 'sheep';
?>

<!--form to add another animal-->
<form action="go.php" method="POST">
<p><input type="text" name="entry1"></p>
<p><input type="submit" name="submit"></p>
</form>

go.php

<?php
session_start();
//add form entry1 to the session array
$_SESSION['animals'][] = $_POST['entry1'];

//print session array
print_r($_SESSION['animals']);
?>

1

Решение

Инициализируйте переменную сеанса, только если она еще не установлена:

if (!isset($_SESSION['animals'])) {
$_SESSION['animals'] = array('pig', 'cow', 'sheep');
}
2

Другие решения

Проверьте

in_array ( ‘YOUR_VALUE’, $ _ SESSION [ ‘животные’])

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

Ссылка: in_array

1

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

<input type=hidden name=extraValue[] value="pig">
<input type=hidden name=extraValue[] value="cow">
etc

На вашей странице PHP отмените предыдущую сессию, поскольку вам нужен «свежий» набор данных, основанный на вводе, а не на старых значениях.

unset($_SESSION['animals']);

Вы можете получить доступ к вашим дополнительным значениям в $ _POST [‘extraValue’]. Затем вы можете объединить оба массива, как

 $postValues = array_merge($_POST['extraValue'], $_POST['entry1']);

Я еще не тестировал этот код, но я бы использовал этот «путь», а не устанавливал значения SESSION перед вводом.

0