PHP. Сохранение массива в файл

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

Естественно при этом встает вопрос о том, в каком формате хранить информацию. Мне самым удобным представляется синтаксис php массива. И для сохранения в нем я использую следующую функцию, которая сохраняет переданный массив в файл с указанным именем.

  1.  
  2. function arraytofile($array, $filename = 0, $file = 0)
  3. {
  4. $level = 1;
  5. if($file == 0)
  6. {
  7. $level = 0;
  8. $file = fopen($filename, "w");
  9. if(!$file)
  10. {
  11. return false;
  12. }
  13. fwrite($file, "<" . "?\n\$_array = ");
  14. }
  15.  
  16. $cnt = count($array);
  17. $i = 0;
  18. fwrite($file, "\narray(\n");
  19. foreach($array as $key => $value)
  20. {
  21. if($i++ != 0)
  22. {
  23. fwrite($file, ",\n");
  24. }
  25. if(is_array($array[$key]))
  26. {
  27. fwrite($file, "'$key' => ");
  28. arraytofile($array[$key], 0, $file);
  29. }
  30. else
  31. {
  32. $value = addcslashes($value, "'"."\\\\");
  33. fwrite($file, str_repeat(' ', ($level + 1) * 2) . "'$key' => '$value'");
  34. }
  35. }
  36. fwrite($file, ")");
  37.  
  38. if($level == 0)
  39. {
  40. fwrite($file, ";\n?".">");
  41. fclose($file);
  42. return true;
  43. }
  44. }
  45.  

Пример использования

  1.  
  2. $a = array(
  3. 0 => 'Данные удобно хранить в php массиве',
  4. 1 => array(
  5. 'str' => 'Можно использовать ассоциативные массивы',
  6. 'data' => array(
  7. 0 => 'и произвольную глубину вложенности',
  8. 1 => 1234567890,
  9. 2 => 'Это не только удобно, но и быстро!'
  10. )));
  11.  
  12. arraytofile($a, 'test.php');
  13.  

Результатом выполнения станет файл, с именем test.php и следующим содержанием.

  1.  
  2. <?
  3. $_array =
  4. '0' => 'Данные удобно хранить в php массиве',
  5. '1' =>
  6. 'str' => 'Можно испльзовать ассоциативные массивы',
  7. 'data' =>
  8. '0' => 'и произвольную вложенность',
  9. '1' => '1234567890',
  10. '2' => 'Это не только удобно, но и быстро!')));
  11. ?>
  12.  

Как видите, получился небольшой php скрипт, для использования которого надо всего лишь включить его в скрипт с помощью include

  1.  
  2. include('test.php');
  3. echo "<pre>";
  4. print_r($_array);
  5. echo "</pre>";
  6.  

В качестве результата в браузере должно появиться следущее

  1.  
  2. (
  3. [0] => Данные удобно хранить в php массиве
  4. [1] => Array
  5. (
  6. [str] => Можно испльзовать ассоциативные массивы
  7. [data] => Array
  8. (
  9. [0] => и произвольную вложенность
  10. [1] => 1234567890
  11. [2] => Это не только удобно, но и быстро!
  12. )
  13.  
  14. )
  15.  
  16. )
  17.  

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

Читайте в блоге

Использование md5 в Oracle.
Несколько слов об использовании Mercurial.
JavaScript и MFC. Интеграция Property Tree в MFC приложение.
Круглая кнопка на JavaScript.
Повторное экранирование кавычек в PHP

Метки: php

Комментарии:

Роланд Чанишвили @ 24.11.2009 21:35

Прикольно :) А когда данных чуть побольше удобно пользовать sqlite - благо он счас на любом хостинге с php5 есть. Вот если бы еще нативную тройку ставили... А то через PDO мне както не нравитса
sartas @ 13.01.2010 08:45

Легче использовать функцию serialize() - она преобразует массив в строку, и записать в файл функцией file_put_contents(). Для того чтобы обратно получить массив - читаем файл file_get_contents() и получаем массив unserialize()

Владимир Рыбаков @ 13.01.2010 21:54

2sartas

Спасибо, мне об этом способе известно, но пользуюсь я своим потому что, он чуточку быстрее при чтении данных (отсутствует вызов функций доступа к файлу и unserialize).

Но главным преимущестовом, для меня, является то, что сохраненный массив можно без всякого труда поправить в любом текстовом редакторе, не путаясь в кавычках, запятых и скобках. Править файл созданый с помощью serialize несколько труднее.
sartas @ 13.01.2010 22:46

Я опять невнимательно прочитал статью :[ и не заметил что файл при чтении не нужно преобразовывать.

Спасибо за функцию!

P.S. Вот что пришло мне на ящик:

X-Mailer: Attachment Mailer ver. 1.0

X-Priority: 3

Content-Type: multipart/mixed;

boundary="_b772ee4fddfd275ffdd98f7eda85cf2d"




This is a multi-part message in MIME format.





--_b772ee4fddfd275ffdd98f7eda85cf2d

Content-type:text/plain; charset=iso-8859-1

Content-Transfer-Encoding: 7bit
//текст письма с html тегами
satras @ 15.01.2010 21:45

Еще проверку типа сделать надо, а то число в строку превратилось, а еще и логические типы есть.

Вот та же функция версии 2002 года: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=664&lngWId=8
Alex @ 21.06.2010 00:08

А сможете сделать такую форму для куки или для php мне нуна чтобы допустем пользователь раставил блоки как есму надо на вот это ст
http://moimir.moy.su/files/DragSort/index.html
и она сохранилось тоесть нужна кнопка сохранить
dark @ 18.11.2011 23:06

$cnt = count($array); - нигде не используется.
Владимир Рыбаков @ 22.11.2011 10:05

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

Код выше, надо рассматривать скорее в учебных целях, например, для того чтобы продемонстрировать рекурсию.

Войдите на сайт, чтобы оставить комментарий