Как использовать php serialize () и unserialize () - PullRequest
109 голосов
/ 27 декабря 2011

Моя проблема очень проста.

Я не нашел ни одного примера, который бы соответствовал моим потребностям относительно того, что именно serialize() и unserialize() означают в php?Они просто приводят пример - сериализуют массив и показывают вывод в необъяснимом формате.Действительно трудно понять основную концепцию, проходящую через их жаргон.

РЕДАКТИРОВАНИЕ:

<?php

$a= array( '1' => 'elem 1', '2'=> 'elem 2', '3'=>' elem 3');
print_r($a);
echo ("<br></br>");
$b=serialize($a);
print_r($b);

?>

вывод:

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

Я не могупонять второй вывод.Кроме того, кто-нибудь может привести пример ситуации, когда мне нужно сериализовать массив php перед его использованием?

Ответы [ 10 ]

146 голосов
/ 27 декабря 2011

Массив или объект PHP или другая сложная структура данных не может быть перенесена, сохранена или иным образом использована за пределами выполняющегося сценария PHP .Если вы хотите сохранить такую ​​сложную структуру данных за один прогон скрипта, вам нужно сериализовать ее.Это просто означает поместить структуру в «более низкий общий знаменатель», который может обрабатываться другими вещами, кроме PHP, такими как базы данных, текстовые файлы, сокеты.Стандартная функция PHP serialize - это просто формат , чтобы выразить такую ​​вещь, она сериализует структуру данных в строковое представление, уникальное для PHP, и может быть преобразовано в объект PHP с помощью unserialize.Однако существует много других форматов, таких как JSON или XML.


Возьмем, к примеру, эту распространенную проблему:

Как передать массив PHP в Javascript?

PHP и Javascript могут общаться только через строки.Вы можете очень легко передать строку "foo" в Javascript.Вы можете очень легко передать число 1 в Javascript.Вы можете легко передавать логические значения true и false в Javascript.Но как передать этот массив в Javascript?

Array ( [1] => elem 1 [2] => elem 2 [3] => elem 3 ) 

Ответ - сериализация .В случае PHP / Javascript JSON на самом деле является лучшим форматом сериализации:

{ 1 : 'elem 1', 2 : 'elem 2', 3 : 'elem 3' }

Javascript может легко преобразовать это в фактический массив Javascript.

Это так же верно, как представлениехотя та же структура данных:

a:3:{i:1;s:6:"elem 1";i:2;s:6:"elem 2";i:3;s:7:" elem 3";}

Но в значительной степени его использует только PHP, этот формат практически не поддерживается нигде.
Хотя это очень распространено и хорошо поддерживается:

<array>
    <element key='1'>elem 1</element>
    <element key='2'>elem 2</element>
    <element key='3'>elem 3</element>
</array>

Есть много ситуаций, когда вам нужно передать сложные структуры данных в виде строк.Сериализация, представляющая произвольные структуры данных в виде строк, решает, как это сделать.

25 голосов
/ 08 апреля 2015

PHP serialize () unserialize () использование

http://freeonlinetools24.com/serialize

echo '<pre>';
// say you have an array something like this 
$multidimentional_array= array(
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 4, 7) 
       ),
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 5, 7) 
       ),
    array(
        array("rose", 1.25, 15),
        array("daisy", 0.75, 25),
        array("orchid", 8, 7) 
    )
);

// serialize 
$serialized_array=serialize($multidimentional_array);
print_r($serialized_array);

, который дает вам что-то вроде этого

a:3:{i:0;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:4;i:2;i:7;}}i:1;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:5;i:2;i:7;}}i:2;a:3:{i:0;a:3:{i:0;s:4:"rose";i:1;d:1.25;i:2;i:15;}i:1;a:3:{i:0;s:5:"daisy";i:1;d:0.75;i:2;i:25;}i:2;a:3:{i:0;s:6:"orchid";i:1;i:8;i:2;i:7;}}}

еще раз, если вы хотите вернуть исходный массив, просто используйте PHP unserialize () функцию

$original_array=unserialize($serialized_array);
var_export($original_array);

Надеюсь, это поможет

7 голосов
/ 27 декабря 2011

Если вы хотите, чтобы ваше значение php было сохраняемым, вы должны превратить его в строковое значение, что делает serialize () unserialize () делает обратное.

5 голосов
/ 27 декабря 2011

Большинство носителей данных могут хранить строку типов.Они не могут напрямую хранить структуру данных PHP, такую ​​как массив или объект, и не должны этого делать, поскольку это связывало бы среду хранения данных с PHP.

Вместо этого serialize() позволяет хранить один изэти структуры в виде строки.Его можно десериализовать из строкового представления с помощью unserialize().

Если вы знакомы с json_encode() и json_decode() (и JSON в целом), концепция аналогична.

4 голосов
/ 30 марта 2017
<?php
$a= array("1","2","3");
print_r($a);
$b=serialize($a);
echo $b;
$c=unserialize($b);
print_r($c);

Запустить эту программу, повторить вывод

a:3:{i:0;s:1:"1";i:1;s:1:"2";i:2;s:1:"3";}


здесь
a = размер массива
я = количество номеров массивов
s = размер значений массива

вы можете использовать serialize для хранения массива данных в базе данных
и можете извлекать и UN-сериализовать данные для использования.

3 голосов
/ 07 августа 2018

Пожалуйста! пожалуйста! пожалуйста! НЕ сериализуйте данные и не помещайте их в свою базу данных. Сериализация может использоваться таким образом, но в ней отсутствует точка реляционной базы данных и типы данных, присущие вашему ядру базы данных. Это делает данные в вашей базе данных непереносимыми, трудными для чтения и может усложнять запросы. Если вы хотите, чтобы ваше приложение было переносимым на другие языки, например, допустим, вы обнаружите, что хотите использовать Java для какой-то части своего приложения, в которой есть смысл использовать Java, сериализация станет проблемой для ягодиц. Вы всегда должны иметь возможность запрашивать и изменять данные в базе данных без использования стороннего посреднического инструмента для манипулирования данными, которые нужно вставить.

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

Это не значит, что serialize () бесполезен. Это не ... Хорошим местом для его использования может быть, например, файл кеша, который содержит результат интенсивной работы с данными. Есть множество других ... Только не злоупотребляйте сериализацией, потому что у следующего парня, который придет, будет кошмар обслуживания или миграции.

Хороший пример serialize () и unserialize () может быть таким:

$posts = base64_encode(serialize($_POST));
header("Location: $_SERVER[REQUEST_URI]?x=$posts");

Сериализация на странице

if($_GET['x']) {
   // unpack serialize and encoded URL
   $_POST = unserialize(base64_decode($_GET['x']));
}
2 голосов
/ 27 декабря 2011

С http://php.net/manual/en/function.serialize.php:

Создает хранимое представление значения. Это полезно для хранения или передачи значений PHP без потери их типа и структуры.

По сути, он берет массив или объект php и преобразует его в строку (которую вы затем можете передать или сохранить по своему усмотрению).

Unserialize используется для преобразования строки обратно в объект.

1 голос
/ 21 июня 2017

Обычно, когда вы сериализуете массивы или объекты, вы просто переводите их в допустимый формат строки, чтобы вы могли легко хранить их вне скрипта php.

  1. Использование serialize для сохранения состояния объекта в базе данных (давайте возьмем класс User в качестве примера). Далее десериализуем данные, чтобы загрузить предыдущее состояние обратно в объект (методы не являются сериализаторами, вам необходимо включить класс объекта, чтобы умеет им пользоваться)
    • персонализация пользователя

Примечание: для объекта вы должны использовать магические методы __sleep и __wakeup. __sleep вызывается serialize (). Спящий метод возвратит массив значений из объекта, который вы хотите сохранить.

__ wakeup вызывается unserialize (). Метод пробуждения должен принимать несериализованные значения и инициализировать их в них в объекте.

Для передачи данных между php и js вы должны использовать json_encode, чтобы преобразовать массив php в допустимый формат json. Или наоборот - используйте JSON.parese () для преобразования выходных данных (строки) в допустимый объект json. Вы хотели бы сделать это, чтобы использовать локальное хранилище. (автономный доступ к данным)

0 голосов
/ 08 июля 2019
preg_match_all('/\".*?\"/i', $string, $matches);
foreach ($matches[0] as $i => $match) $matches[$i] = trim($match, '"');

0 голосов
/ 17 апреля 2014

Да, я могу.Предположим, нам нужно отслеживать системные средства. В вашей системе более одного администратора и субадмина. Все они могут вставлять, обновлять или редактировать любую информацию. Позже вам необходимо знать, кто вносит эти изменения.Для решения этой проблемы вам нужно сериализовать.

  **Explain:**Create a table named history which stores all changes. Each time there is a change insert a new row in this table. It might have this fields:

  history(id,target_table(name of the table), target_id (ID of the saved entry),create/edit/change data (serialized data of the saved row),date)

Надеюсь, это вам поможет.

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