Как использовать 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);
?>
ouput:
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 () usage
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 () function
$original_array=unserialize($serialized_array); var_export($original_array);Я надеюсь, что это поможет
когда вы хотите сделать ваше значение php хранимым, вы должны превратить его в строковое значение, вот что serialize () делает. И 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";}
здесь
a=размер массива
i=количество номеров массива
s=размер массива значенийвы можете использовать сериализацию для хранения массива данных в базе данных
и может извлекать и не-сериализовать данные для использования.
от http://php.net/manual/en/function.serialize.php:
генерирует хранящееся представление значения. Это полезно для хранения или передачи значений PHP без потери их типа и структуры.
по существу, он принимает PHP-массив или объект и преобразует его в строку (которую вы можете передать или сохранить по своему усмотрению).
Unserialize используется для преобразования строки обратно в объект.
пожалуйста! пожалуйста! пожалуйста! Не сериализуйте данные и не помещайте их в базу данных. Сериализация может использоваться таким образом, но в этом отсутствует точка реляционной базы данных и типы данных, присущие вашему ядру базы данных. Это делает данные в базе данных непереносимыми, трудными для чтения и может усложнить запросы. Если вы хотите, чтобы ваше приложение было переносимым на другие языки, например, вы обнаружите, что хотите использовать Java для некоторой части вашего приложения, которое имеет смысл использовать Java в сериализации станет болью в ягодицах. Вы всегда должны иметь возможность запрашивать и изменять данные в базе данных без использования стороннего посредника для управления вставляемыми данными.
это действительно затрудняет поддержку кода, кода с проблемами переносимости и данных, которые сложнее перенести в другие системы 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-скрипта.
- использование сериализации для сохранения состояния объекта в базе данных (возьмем класс пользователя в качестве примера) далее восстановить данные для загрузки, предыдущем состоянии объекта (методы не сериализатор необходимо включить объект класса, чтобы иметь возможность использовать его)
- персонализация пользователей
Примечание для объекта вы должны использовать magic __sleep и _ _ wakeup методы. __sleep вызывается serialize (). Метод sleep возвращает массив значений из объекта, который вы хотите сохранить.
__wakeup вызывается unserialize (). Метод пробуждения должен принимать несериализованные значения и инициализировать их в них в объекте.
для передачи данных между php и js вы бы использовали json_encode, чтобы превратить PHP массив в действительный json формат. Или наоборот-используйте JSON.parese () для преобразования выходных данных (строки) в допустимый объект json. Вы хотели бы сделать это, чтобы использовать локальное хранилище. (автономный доступ к данным)
Comments