Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Как удалить BOM из файлов

24.12.2017 | Категория: Web-мастеру и не только | Автор: ManHunter
Маркер последовательности байтов, он же BOM - специальный символ Юникода, который вставляется в начало текстового файла для обозначения того, что в этом файле используется Юникод. Согласно спецификации, использование этого символа не является обязательным, однако оно широко распространено, что иногда приводит к проблемам при обработке данных.

Так, к примеру, однажды я столкнулся с ситуацией, когда от сторонней системы передавался файл в формате JSON, а я у себя должен был извлечь поступившие данные при помощи стандартной функции PHP json_decode. Файл передается и принимается успешно, на первый взгляд имеет абсолютно корректную структуру, правильно открывается в браузере и блокноте, но функция декодирования все равно возвращает ошибку, что данные некорректные. Сейчас я не смогу сказать, сколько времени потратил на выяснение причины ошибки, пока, наконец, не решил открыть файл при помощи HEX-редактора. Оказалось, что всему виной был маркер BOM, из-за которого функция json_decode не могла корректно раскодировать файл.

Для решения проблемы я быстренько нарисовал вот такую функцию в несколько строчек:
  1. // Функция удаления BOM из потока данных
  2. function remove_BOM($data) {
  3.     // Маркер UTF-8
  4.     if (substr($data,0,3)=="\xEF\xBB\xBF") {
  5.         return substr($data,3);
  6.     }
  7.     // Маркер UTF-16
  8.     elseif (substr($data,0,2)=="\xFF\xFE") {
  9.         return substr($data,2);
  10.     }
  11.     else {
  12.         return $data;
  13.     }
  14. }
При получении файла данные сперва обрабатывались при помощи этой функции и только после этого отправлялись на декодирование в json_decode.

Просмотров: 422 | Комментариев: 1

Расстояние между двумя точками на карте

27.08.2017 | Категория: Web-мастеру и не только | Автор: ManHunter

Расстояние между двумя точками на карте

Одна из задач, с которой могут столкнуться разработчики - вычисление расстояния между двумя точками на карте. Это может быть определение объектов, которые находятся вблизи какой-то конкретной точки, оценка времени перемещения из одной точки в другую, вариантов применения может быть много.

Читать статью целиком »
Просмотров: 934 | Комментариев: 2

Выборка родительских элементов в древовидном массиве

18.08.2017 | Категория: Web-мастеру и не только | Автор: ManHunter
Создавать многомерный массив из одномерного массива с указателями на родительские элементы мы уже умеем. Но может возникнуть другая задача: зная ID элемента, надо получить все его родительские элементы, причем уровень вложенности может быть абсолютно любым. Пример из практики. В базе хранится список стран и регионов, перелинкованный через указатели на родительские элементы. Если его развернуть в многомерный массив, то получится примерно следующее:
  1. $regions=array(
  2.     1=>array(
  3.         'name'=>'Россия',
  4.         'parent'=>0,
  5.         'child'=>array(
  6.             2=>array(
  7.                 'name'=>'Москва и Московская область',
  8.                 'parent'=>1,
  9.                 'child'=>array(
  10.                     3=>array(
  11.                         'name'=>'Москва',
  12.                         'parent'=>2,
  13.                         'child'=>array(
  14.                         ),
  15.                     ),
  16.                     5=>array(
  17.                         'name'=>'Московская область',
  18.                         'parent'=>2,
  19.                         'child'=>array(
  20.                             6=>array(
  21.                                 'name'=>'Дмитровский район',
  22.                                 'parent'=>6,
  23.                                 'child'=>array(
  24.                                     7=>array(
  25.                                         'name'=>'Дмитров',
  26.                                         'parent'=>6,
  27.                                         'child'=>array(),
  28.                                     ),
  29.                                     9=>array(
  30.                                         'name'=>'Яхрома',
  31.                                         'parent'=>6,
  32.                                         'child'=>array(),
  33.                                     ),
  34.                                 ),
  35.                             ),
  36.                         ),
  37.                     ),
  38.                 ),
  39.             ),
  40.             4=>array(
  41.                 'name'=>'Пермский край',
  42.                 'parent'=>1,
  43.                 'child'=>array(
  44.                     8=>array(
  45.                         'name'=>'Пермь',
  46.                         'parent'=>4,
  47.                         'child'=>array(),
  48.                     ),
  49.                     10=>array(
  50.                         'name'=>'Соликамск',
  51.                         'parent'=>4,
  52.                         'child'=>array(),
  53.                     ),
  54.                     11=>array(
  55.                         'name'=>'Кунгур',
  56.                         'parent'=>4,
  57.                         'child'=>array(),
  58.                     ),
  59.                 ),
  60.             ),
  61.         ),
  62.     ),
  63. );
Есть некие объекты, привязанные к региону по его ID. Как получить список всех вышестоящих регионов для конкретного объекта?

Читать статью целиком »
Просмотров: 416 | Комментариев: 2

Сумма прописью на PHP

07.08.2017 | Категория: Web-мастеру и не только | Автор: ManHunter

Сумма прописью на PHP

В соответствии с нормативными актами, регламентирующими порядок работы с бухгалтерскими документами, при заполнении многих унифицированных форм сумма указывается не только числами, но и прописью. Формат записи принят следующий: рублевая часть суммы указывается прописью в именительном падеже с заглавной буквы, а копейки обозначаются цифрами. При автоматической генерации документов на PHP с цифровыми выражениями проблем в принципе не возникает, а для преобразования чисел в сумму прописью я уже давно написал и использую вот такую функцию.

Читать статью целиком »
Просмотров: 786 | Комментариев: 4

Рекурсивный обход каталогов на PHP

17.07.2017 | Категория: Web-мастеру и не только | Автор: ManHunter
Понадобилась универсальная функция для рекурсивного сканирования выбранного каталога, но не просто так, а с обработчиком найденных файлов. Вот что у меня получилось:
  1. //--------------------------------------------------------------
  2. // Функция рекурсивного сканирования каталога
  3. //--------------------------------------------------------------
  4. // Параметры:
  5. //   $directory - начальный каталог
  6. //   $callback - функция для обработки найденных файлов
  7. //--------------------------------------------------------------
  8. function scan_recursive($directory$callback=null) {
  9.     // Привести каталог в канонизированный абсолютный путь
  10.     $directory=realpath($directory);
  11.  
  12.     if ($d=opendir($directory)) {
  13.         while($fname=readdir($d)) {
  14.             if ($fname=='.' || $fname=='..') {
  15.                 continue;
  16.             }
  17.             else {
  18.                 // Передать путь файла в callback-функцию
  19.                 if ($callback!=null && is_callable($callback)) {
  20.                     $callback($directory.DIRECTORY_SEPARATOR.$fname);
  21.                 }
  22.             }
  23.  
  24.             if (is_dir($directory.DIRECTORY_SEPARATOR.$fname)) {
  25.                 scan_recursive($directory.DIRECTORY_SEPARATOR.$fname$callback);
  26.             }
  27.         }
  28.         closedir($d);
  29.     }
  30. }
Пример вызова функции:
  1. // Callback-функция, которая будет принимать имена файлов
  2. function scan_callback($fname) {
  3.     echo $fname.'<br/>';
  4. }
  5.  
  6. // Вывести список файлов и каталогов
  7. scan_recursive('C:/some_dir\subfolder/''scan_callback');
В этом случае будет просто выведен список файлов и вложенных каталогов с содержимым, находящихся по указанному пути. Функцию можно доработать, например, добавив возможность остановки сканирования при получении какого-нибудь ответа из callback-функции. Но пока такой задачи не возникало.

Просмотров: 804 | Комментариев: 2

prev 01 02 03 04 05 06 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2018
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 3 (0.0419 сек.) / Память: 4.75 Mb
Наверх