Иногда залезишь в базу данных какой нибудь системы управления сайтом и видишь в таблицах такого формата запись:
a:1:{s:5:"top_2";a:2:{i:0;s:4:"Рыся";i:1;s:6:"555555";}}
понятно что данные, как то по хитрому уложены, но что это, крутая библиотека, хитроумный код?
Но на самом деле все просто, это стандартные функции кодирования и декодривания масивов в php.
Узнал о этих функциях случайно. Я тогда работал со скриптом который собирал данные в течение десяти минут, и каждый раз запускать его, что бы посмотреть ту или иную информацию в удобном для меня html оформлением, как оказалос дело было долгим.
Тогда я и начал искать способы сохранения данных. Первым на ум пришли базы данных, но масив оказался не совсем структурированым и дело напоминало танцы с бубном.
Вторая идея была сохранения в файл, раньше я гостевые книги так делал разделяя данные этим символом "|", строки были записями, но в моем случает у разных разделов масива глубина была разная, что то универсальное писать времени не было.
Открыв справочник полистав раздел работы с масивом нашел эти замечательные функции serialize() и unserialize().
Применив знания на своем скрипте, был очень удивлен простоте решения задачи. Ну что бы запомнить написал эту статью.
Прикладываю не большой обучающий код с коментариями:
<?php
//Небольшой масив, например рекорды топ 3х игроков для игры.
$mas = array (
'top_1' => array (
'Maksim',
'777777'
),
'top_2' => array (
'Рыся',
'555555'
),
'top_3' => array (
'Lamer_XP',
'910707'
)
);
// Файл сооздать и лучше сохранить в кодировке UTF-8
// Надеюсь путь к файлу казали правильно, в коде нет проверки через функцию is_file();
// Если файл в ручную не создан, фукнция создаст сама но кодировка будет разная, в зависимость от ОС для Windows 7 это будет Ansi
$file_name='data.txt';
// выводим наш эталонный масив для наглядного сравнения
// print_r() - выводит масив со специальным форматированием, для удобного представления масива
echo '<pre>';
print_r($mas);
echo '</pre>';
// serialize() - преобразует масив в строку текста со специальным форматированием
// file_put_contents('file_name.txt','Текст для записи')
// Первый параметр путь к файлу вкоторый будем записывать
// Второй параметр записываемый текст, его мы делаем из масива с помощью функции serialize()
// $bait - в эту фукнция file_put_contents() возращает размер записи в файл
$bait=file_put_contents($file_name,serialize($mas));
// Если взять наш масив, то после serialize($mas) масив создает вот такую строку текста:
// a:3:{s:5:"top_1";a:2:{i:0;s:6:"Maksim";i:1;s:6:"777777";}s:5:"top_2";a:2:{i:0;s:4:"Рыся";i:1;s:6:"555555";}s:5:"top_3";a:2:{i:0;s:8:"Lamer_XP";i:1;s:6:"910707";}}
echo 'Записано '.$bait.' байт в файл '.$file_name.' <br/>';
// file_get_contents() - возращает содержимое файла, в скобка путь к файлу
// unserialize() - раскодирует и превращает в масив, то что закодировало serialize()
// все это присваиваем переменой $input_mas, которая становиться масивом
$input_mas=unserialize(file_get_contents($file_name));
// Выводим второй масив, если все верно он должон совпадать с первым.
// Если файл data.txt был не в UTF-8 формате, он может вывести не тот текст, который ожидается
// Для смены кодировки используйте Notepad ++; (на тойже строке где меню File) Encoding / Convert to UTF-8
echo '<pre>';
print_r($input_mas);
echo '</pre>';
// 100% Русский код.
// Рыся.РФ - Программирование.
?>
Ps:Кто будет дальше разрабатывать может пригодиться так же фукнции:utf8_encode().
Pss:После в сеть залез посмотреть какие еще есть решения, была одна задумка с помощью print_r конвертировать в строку и сохранять в файл с расширением php, а после его подключать. Но нашел опять же функцию var_export() - она также как print_r выводит масив, только возращает правильный php код масива. Также есть функция var_dump() - почти аналог print_r, только при выводе указывает тип переменной: string,float,bool..