Рейтинг@Mail.ru
 

Сериализация


Ну что такое массив, нам уже известно. Куча переменных в одной упаковке. С ними очень удобно работать, так как для массивов придумано множество функций. Но есть одна загвоздка. Как сохранить массив для потомков? Пока он в оперативной памяти - все шито-крыто. А как только нам потребуется записать его в файл - вот тут начинается грабля.

Дело в том, что если обратиться к массиву, как к строке
1
2
3
4
5
6
<?php

    $array 
= array(123); 
    echo 
$array;


то на свет явится такое безобразие:
Array


То есть что массив - понятно, а что в нем, история умалчивает. А для того, чтобы записать данные в файл, их нужно представить в виде строки, ни как не иначе. И тут начинаются изобретения. Можно записать массив как таковой в исполняемый файл. Но во первых, его будет крайне сложно редактировать, а во вторых нам нужен простой, текстовый файл, а не исполняемый.

Можно расположить элементы на строках, а потом достать функцией file(). Но опять же такой способ работает только с простыми массивами. Для ассоциативных и вложенных это не годится.

Многие пытаются оказаться от этого в пользу хранения множественных данных в строке с разделителями. Допустим так:
1
2
3
4
5
6
7
8
9
10
11
<?php

    $array 
= array( 
                     
'first'  => 'value1'
                     
'second' => 'value2',  
                     ); 
                      
    foreach(
$array as $key => $value
        
$string .= $key ."|"$value ."\n";


В результате получается примерно это:
first|value1
second|value2


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

Так какой же выход?

На самом деле все очень просто. Для этой цели придуманы специальные функции - serialize() и unserialize()
Первая преобразует массив в строку таким образом, что вторая может спокойно и безопасно массив из неё восстановить.
Механизм такой. Берем массив, сериализуем его и смотрим, что вышло.
1
2
3
4
5
6
7
8
9
10
11
12


    $array 
= array( 
                     
'first'  => 'value1'
                     
'second' => 'value2',  
                     ); 
                      
    
$string serialize($array);    
                       
    echo 
$string;


Вышла странная строка с какими то кракозяблами.
a:2:{s:5:"first";s:6:"value1";s:6:"second";s:6:"value2";}
Но это только на первый взгляд ничего не ясно. Если приглядеться, то вырисовывается довольно стройная структура.
a:2: обозначает, что в массиве два элемента. Дальше в скобках сами элементы. они тоже промаркированы. s:5: обозначает, что в ключе или значении (что идет за этим) пять символов. Ну а дальше сам ключ или элемент. Таким образом, зная сколько где и чего, можно легко восстановить справедливость.

Допустим мы запишем полученную строку в файл, а потом, прочитав оттуда, преобразуем обратно в массив функцией unserialize()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17


    $array 
= array( 
                     
'first'  => 'value1'
                     
'second' => 'value2',  
                     ); 
                      
    
$string serialize($array);    
                       
    
file_put_contents('text.txt'$string); 
    
$string file_get_contents('text.txt'); 
     
    
$array unserialize($string); 
     
    
print_r($array);


На выходе мы получим то, что и требовалось:
Array
(
    [first] => value1
    [second] => value2
)


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