Как использовать PHP serialize () и unserialize()

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

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

EDIT:

<?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 перед его использованием?

9 ответов


массив 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>

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


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);

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


когда вы хотите сделать ваше значение php storable, вы должны превратить его в строковое значение, вот что сериализовать() делает. И unserialize () делает обратную вещь.


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

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

если вы знакомы с json_encode() и json_decode() (и JSON в целом), понятие подобный.


<?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";}


вот!--7--> a=размер массива
i=количество номеров массива
s=размер значений массива

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


от http://php.net/manual/en/function.serialize.php:

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

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

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


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

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

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

хороший пример searilize () и unsearilize () может быть следующим:

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

Unsearilize на страница

if($_GET['x']) {
   // unpack searilized and ecoded URL
   $_POST = unserialize(base64_decode($_GET['x']));
}

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

  **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)

Я надеюсь, что это поможет вам.


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

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

Примечание для объекта вы должны использовать методы magic _ _ sleep и _ _ wakeup. __sleep вызывается методом serialize (). Метод sleep возвращает массив значений из объекта, который необходимо сохранить.

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

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