AGAVA partners programs http://agava.ru/partners/            

Название функции

             
Веб-курсы


Что это?

Оглавление

Основы
Основы основ

Практика
Гостевая книга
Простой сайт
Структура сайта (MVC)
Ядро (Light)
Ядро
Гостевая на SQL
Статические страницы
Модуль новостей
Система регистрации

Теория
Дебаггинг
Регулярные выражения
Введение в ООП
Паттерны проектирования

Репозитарий
BB-code
Почтовый класс
Пагинатор
Всякие полезности

Download
Полезные утилиты

Разное
Видеокурсы
Последние изменения
Вопросы и замечания сюда



Реклама

Диеты для похудения
Фреймворк Kohana. Обучение. Мануал на русском.







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

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

Дело в том, что если обратиться к массиву, как к строке
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
)


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

Рейтинг@Mail.ru Рейтинг@Mail.ru Яндекс цитирования
irbis-team © 2009