Скопируйте многомерный массив по значению (не по ссылке) в PHP - PullRequest
1 голос
/ 25 марта 2010

Язык: PHP

У меня есть форма, которая запрашивает у пользователей информацию об образовании, детали курса и технические детали. Когда форма отправлена, страница переходит на другую страницу, чтобы запустить процессы обработки информации и сохранить детали в базе данных. ОДНАКО (!) Затем мне нужно вернуть страницу обратно на исходную страницу, где требуется доступ к исходной информации поста.

Я думал, что было бы просто скопировать (по значению) многомерный (md) массив $ _POST в $ _SESSION ['post']

session_start(); 
$_SESSION['post'] = $_POST;

Однако, похоже, это только помещает верхний уровень массива в $ _SESSION ['post'], ничего не делая с дочерними / вложенными массивами.

Сокращенная форма массива md $ _POST выглядит следующим образом:

Array
(
    [formid] => 2
    [edu] => Array
        (
            ['id'] => Array
                (
                    [1] => new_1
                    [2] => new_2
                )

            ['nameOfInstitution'] => Array
                (
                    [1] => 1
                    [2] => 2
                )

            ['qualification'] => Array
                (
                    [1] => blah 
                    [2] => blah
                )

            ['grade'] => Array
                (
                    [1] => blah
                    [2] => blah 
                )

        )

    [vID] => 61
    [Submit] => Save and Continue
)

Если я повторяю $ _SESSION ['post'] ['formid'], он пишет "2", а если я повторяю $ _SESSION ['post'] ['edu'], он возвращает "Array". Если я проверяю, что edu является массивом (is_array ($ _ SESSION ['post'] ['edu])), он возвращает true. Если я повторяю $ _SESSION ['post'] ['edu'] ['id'], он возвращает массив, но при проверке (is_array ($ _ SESSION ['post'] ['edu] [' id '])) он возвращает ложь, и я не могу повторить ни один из элементов.

Как успешно скопировать (по значению, а не по ссылке) весь массив (включая его дочерние элементы) в новый массив?

СПАСИБО ВСЕМ ЗА ОТВЕТСТВЕННОСТЬ - ОБНОВЛЕНИЕ
Проблема была вызвана моими нерелевантными кавычками при именовании полей в моей форме.

Ответы [ 5 ]

2 голосов
/ 25 марта 2010

если это ваш настоящий вывод print_r, то у вас есть несколько нежелательных символов в ключах массива.

Array
(
    [formid] => 2
    [edu] => Array //<--- $_SESSION['post']['edu']
        (
            ['id'] => Array // <---- $_SESSION['post']['edu']["'id'"]
2 голосов
/ 25 марта 2010

Я не могу сказать, почему это не сработает

session_start(); 
$_SESSION['post'] = $_POST;

На 2-й странице вы звоните session_start(), прежде чем получить доступ к $_SESSION?

Вы можете поместить это прямо под session_start(), чтобы помочь отладке.

var_dump($_SESSION);
1 голос
/ 25 марта 2010

DCD на правильном пути.

Обычно я сохраняю сериализованную версию формы в сеансе, а затем отменяю сериализацию, когда мне нужно ее использовать.

Для хранения:

$_SESSION['post'] = serialize($_POST);

Чтобы получить его:

$post = unserialize( $_SESSION['post'] );
1 голос
/ 25 марта 2010

Вы можете использовать serialize () для преобразования массива в строку и передачи его по почте или сохранения в сеансе.

Я заметил странное поведение при сохранении массива в $ _SESSION в PHP. Иногда, если вы делаете ссылку и используете ее, это проще, например:

$session =& $_SESSION['post'];

$session = array ();

Не спрашивай почему, хотя:)

Кроме того, чтобы расширить то, что сказал Хаим Евги в комментарии, оберните print_r в теги <pre>, например:

<code>echo "<pre>";
print_r ($array);
echo "
";

, чтобы сделать вывод массива читабельным.

0 голосов
/ 25 марта 2010

Если вы используете echo в массивах, PHP выведет «Array» вместо содержимого массива. Вместо этого используйте print_r.

Ваше задание выглядит только как ссылка. Внутренне (для сохранения памяти) это ссылка, пока вы не измените $_SESSION['post']. С этого момента у вас будет две отдельные переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...