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

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

Я не нашел ни одного примера, который бы соответствовал моим потребностям относительно того, что именно 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 перед его использованием?

Ответ 1

Массив или объект PHP или объект или другая сложная структура данных нельзя переносить или хранить или использовать иным образом за пределами работающего PHP скрипт. Если вы хотите сохранить такую ​​сложную структуру данных за один проход script, вам необходимо ее сериализовать. Это просто означает, что структура превращается в "более низкий общий знаменатель", который может обрабатываться другими вещами, кроме 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>

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

Ответ 2

Использование сериализации PHP() 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);

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

Ответ 3

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

Ответ 4

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

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

Если вы знакомы с json_encode() и json_decode() (и JSON вообще), концепция похожа.

Ответ 5

<?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 = размер массива
i = количество номеров массивов
s = размер значений массива

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

Ответ 6

Пожалуйста! пожалуйста! пожалуйста! НЕ сериализуйте данные и не помещайте их в свою базу данных. Сериализация может быть использована таким образом, но при этом отсутствует точка реляционной базы данных и типы данных, присущие вашему ядру базы данных. Это делает данные в вашей базе данных непереносимыми, трудными для чтения и может усложнять запросы. Если вы хотите, чтобы ваше приложение было переносимым на другие языки, например, допустим, вы обнаружите, что хотите использовать 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']));
}

Ответ 7

Из http://php.net/manual/en/function.serialize.php:

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

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

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

Ответ 8

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

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

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

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

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

Ответ 9

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

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

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

Ответ 10

preg_match_all('/\".*?\"/i', $string, $matches);
foreach ($matches[0] as $i => $match) $matches[$i] = trim($match, '"');