Передача масиву за допомогою прихованого елемента форми HTML


80

Я намагаюсь опублікувати масив у прихованому полі і хочу отримати цей масив після подання форми в PHP.

$postvalue = array("a", "b", "c");
<input type="hidden" name="result" value="<?php echo $postvalue; ?>">

Але я отримую лише рядок масиву після друку опублікованого значення. То як я можу це вирішити?


1
Вам потрібно серіалізувати це якимось чином. Перевірте функції serialize та json_encode. Я б рекомендував піти з json_encode.
Gazler

Відповіді:


119

Використання:

$postvalue = array("a", "b", "c");
foreach($postvalue as $value)
{
    echo '<input type="hidden" name="result[]" value="'. $value. '">';
}

І ви отримаєте $_POST['result']як масив.

print_r($_POST['result']);

тож для масиву масивів назва буде виглядати так: name = "result [[]]"?
Самуель Дарсон

1
@SamuelGiftson може бути таким name="result[][]"
Nurkartiko

38

Досягти цього в основному можна двома способами:

  1. Серіалізувати дані певним чином:

    $postvalue = serialize($array); // Client side
    
    $array = unserialize($_POST['result']; // Server side
    

А потім можна десериалізувати опубліковані значення за допомогою unserialize($postvalue). Додаткову інформацію про це можна знайти тут у посібниках PHP .

Альтернативно, ви можете використовувати функції json_encode()і json_decode()для отримання серіалізованого рядка у форматі JSON. Ви навіть можете зменшити передані дані за допомогою gzcompress()(зверніть увагу, що це вимагає високої продуктивності) і захистити передані дані за допомогою base64_encode()(щоб ваші дані вижили в не 8-бітних чистих транспортних шарах) Це може виглядати так:

    $postvalue = base64_encode(json_encode($array)); // Client side

    $array = json_decode(base64_decode($_POST['result'])); // Server side

Нерекомендований спосіб серіалізації даних (але дуже дешевий у продуктивності) - це просто використовувати implode()у своєму масиві, щоб отримати рядок із усіма значеннями, розділеними деяким заданим символом. На стороні сервера ви можете отримати масив за допомогою explode(). Але зауважте, що ви не повинні використовувати символ для розділення, що трапляється у значеннях масиву (або потім його уникати), і що ви не можете передавати ключі масиву цим методом.

  1. Використовуйте властивості спеціальних іменованих елементів введення:

    $postvalue = "";
    foreach ($array as $v) {
      $postvalue .= '<input type="hidden" name="result[]" value="' .$v. '" />';
    }
    

    Ось так ви отримуєте весь масив у $_POST['result']змінній, якщо форма надіслана. Зверніть увагу, що це не передає ключі масиву. Однак ви можете досягти цього, використовуючи result[$key]як ім'я кожного поля.

Кожен із цих методів отримав свої переваги та недоліки. Те, що ви використовуєте, в основному залежить від того, наскільки великим буде ваш масив, оскільки вам слід спробувати надіслати мінімальну кількість даних за допомогою усіх цих методів.

Інший спосіб досягти цього - зберігати масив у сесії на стороні сервера, а не передавати його на стороні клієнта. Таким чином, ви можете отримати доступ до масиву через $_SESSIONзмінну і не потрібно нічого передавати через форму. Для цього подивіться основний приклад використання сесій на php.net .


1
Мені довелося використовувати одинарні лапки навколо valueатрибута. В іншому випадку дані були обрізані з першої подвійної лапки в серіалізованій версії.
VeeK

Я зробив це за допомогою json_encode. Другий аргумент для json_decode у моєму випадку мав бути істинним (повернути асоціативний масив замість StdClass за замовчуванням)
jamil

22

Ви можете використовувати serialize і base64_encode з боку клієнта. Після цього використовуйте unserialize та base64_decode на стороні сервера.

Подібно до:

На стороні клієнта використовуйте:

    $postvalue = array("a", "b", "c");
    $postvalue = base64_encode(serialize($array));

   // Your form hidden input
   <input type="hidden" name="result" value="<?php echo $postvalue; ?>">

На стороні сервера використовуйте:

    $postvalue = unserialize(base64_decode($_POST['result']));
    print_r($postvalue) // Your desired array data will be printed here

Це повинна бути правильна відповідь, краще, ніж використовувати foreach, ви можете передавати об'єкти в масиви та багаторівневі масиви
Леонардо Сапуй

Ця відповідь не отримує достатньо кредитів. Просто використання serialize () або json_encode () - це речі, які більшість людей намагалися зрозуміти і не вдаються на основі лапок до того часу, коли вони потрапляють сюди. Ця відповідь робить крок далі і кодує її таким чином, що робить це питання неактуальним елегантно. Браво!
Каджі

дякую, це саме те, що я шукав. Одне невеличке зауваження. $ postvalue = base64_encode (серіалізувати ($ масив)); має бути $ postvalue = base64_encode (серіалізувати ($ postvalue));
анатак

9

Або серіалізуйте:

$postvalue=array("a","b","c");
<input type="hidden" name="result" value="<?php echo serialize($postvalue); ?>">

при отриманні: unserialize($_POST['result'])

Або вибухнути:

$postvalue=array("a","b","c");
<input type="hidden" name="result" value="<?php echo implode(',', $postvalue); ?>">

При отриманні: explode(',', $_POST['result'])


1
serialize може зіпсувати ваші цитати або дужки і змішати з html .. Я б використав прийняту відповідь
zachu

1

Якщо ви хочете опублікувати масив, ви повинні використовувати інший запис:

foreach ($postvalue as $value){
<input type="hidden" name="result[]" value="$value.">
}

таким чином у вас є три поля вводу з іменем result [] і при опублікуванні $_POST['result']буде масив


1
<input type="hidden" name="item[]" value="[anyvalue]">

Нехай у повторному режимі він опублікує цей елемент у формі як масив і використовуватиме

print_r($_POST['item'])

Щоб отримати елемент


1

Краще кодувати спочатку в рядок JSON, а потім кодувати Base64, наприклад, на стороні сервера в зворотному порядку: спочатку використовуйте функції base64_decode, а потім json_decode. Таким чином, ви відновите свій PHP-масив.


-1

Ви можете зробити це так:

<input type="hidden" name="result" value="<?php foreach($postvalue as $value) echo $postvalue.","; ?>">
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.