Быстрый поиск
Введите фрагмент названия статьи для поиска
Преобразование массива чисел в интервалы
06.08.2016 | Категория: Web-мастеру и не только | Автор: ManHunter
По работе возникла необходимость обработать массив чисел таким образом, чтобы все последовательные значения в нем были преобразованы в интервалы. То есть массив [1, 3, 4, 5, 6, 9, 10, 15] должен превратиться в ["1", "3-6", "9-10", "15"]. Быстренько набросал вот такую функцию, может быть пригодится кому-нибудь еще.Code (PHP) : Убрать нумерацию
- // Преобразование массива чисел в интервалы
- function array_to_intervals($data=array(), $divider='-') {
- // Оставить только уникальные значения
- $data=array_unique($data);
- sort($data);
- $tmp=array();
- $begin=$end=0;
- for ($i=0; $i<count($data); $i++) {
- // Начало интервала или одиночное значение
- if ($begin==0) {
- $begin=$end=$data[$i];
- }
- if (isset($data[($i+1)])) {
- // Расширить границы интервала
- if ($data[($i+1)]==($end+1)) {
- $end++;
- }
- else {
- // Одиночное значение
- if ($begin==$end) {
- $tmp[]=$begin;
- }
- // Интервал
- else {
- $tmp[]=$begin.$divider.$end;
- }
- $begin=$end=0;
- }
- }
- }
- if (count($data)) {
- // Последнее значение
- if ($begin==$end) {
- $tmp[]=$begin;
- }
- else {
- $tmp[]=$begin.$divider.$end;
- }
- }
- return $tmp;
- }
Просмотров: 2123 | Комментариев: 3
Гномья сортировка массива на Ассемблере
23.03.2016 | Категория: Образ мышления: Assembler | Автор: ManHunter
Гномья сортировка массива на Ассемблере
Гномья сортировка - один из методов сортировки данных, сочетающий в себе элементы алгоритмов сортировки пузырьком и сортировки вставками. Такое необычное название алгоритм получил благодаря голландскому ученому Дику Груну, детально исследовавшему этот метод сортировки. Вот как он описывает гномью сортировку в своих работах:
Гномья сортировка основана на технике, используемой обычным голландским садовым гномом. Это метод, которым садовый гном сортирует линию цветочных горшков. Он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперед, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперед; если нет следующего горшка, он закончил.
Алгоритм находит первое место, где два соседних элемента стоят в неправильном порядке и меняет их местами. Он пользуется тем фактом, что обмен может породить новую пару, стоящую в неправильном порядке, только до или после переставленных элементов. Сортировка простая, не требует вложенных циклов и вспомогательных массивов, все данные сортируются за один проход.
Читать статью целиком »
Просмотров: 5395 | Комментариев: 7
Преобразование числа в строку с разделением на разряды
17.01.2016 | Категория: Образ мышления: Assembler | Автор: ManHunter
Преобразование числа в строку с разделением на разряды
Если вы работаете с большими десятичными числами, то наверняка согласитесь, что число с разделением на разряды (то есть с группировкой по три символа: тысячи, миллионы и так далее) воспринимается гораздо лучше, чем просто последовательность цифр. Так проще выявлять ошибки или, например, с одного взгляда можно оценить порядок числа.
Читать статью целиком »
Просмотров: 5239 | Комментариев: 9
Как на PHP корректно прибавить месяц к дате
27.11.2015 | Категория: Web-мастеру и не только | Автор: ManHunter
Как на PHP корректно прибавить месяц к дате
Одна из интересных задач, с которой мне приходилось сталкиваться на практике при работе с датами на PHP, это так называемый "календарный месяц". То есть некий интервал дат, отличающийся на месяц. Если дата находится где-то в середине или в начале месяца, то никаких сложностей, просто увеличиваем номер месяца на единицу, при необходимости корректируем год. А проблема начинается в тех случаях, когда дата начала интервала приходится на какое-нибудь число в конце месяца. Просто увеличить значение месяца на следующий, оставив число без изменений, нельзя, полученная дата может оказаться несуществующей. Добавлять 30 или 31 день тоже некорректно, в коротком феврале итоговая дата после такого прибавления перемахнет на начало марта. Вот для наглядности несколько примеров, чтобы было понятно, о чем идет речь:
Code (PHP) : Убрать нумерацию
- //------------------------------------------------------
- // Дата в начале или в середине месяца
- //------------------------------------------------------
- echo date('d.m.Y',strtotime('2015-01-12 +1 month'));
- // 12.02.2015 - правильно
- //------------------------------------------------------
- // Дата в конце месяца
- //------------------------------------------------------
- echo date('d.m.Y',strtotime('2015-01-29 +1 month'));
- // 01.03.2015 - неправильно! Ожидалось 28.02.2015
- echo date('d.m.Y',strtotime('2015-01-31 +1 month'));
- // 03.03.2015 - неправильно! Ожидалось 28.02.2015
- echo date('d.m.Y',strtotime('2015-11-30 +1 month'));
- // 30.12.2015 - неправильно! Ожидалось 31.12.2015
Читать статью целиком »
Просмотров: 17161 | Комментариев: 6
Работа с Quoted-Printable строками на Ассемблере
25.04.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
Механизм конвертации Quoted-Printable предназначен для представления данных, в основном состоящих из байтов, соответствующих символам, имеющим изображение в символьном наборе ASCII. Если конвертируемые данные в основном представляют собой ASCII-текст, то конечная их форма остается узнаваемой и читаемой для человека. Как правило, такое кодирование используется при передаче бинарных данных или текстов в различных кодировках через электронную почту. Сообщение, полностью состоящее из ASCII-символов, также может быть конвертировано в Quoted-Printable, что гарантирует его содержимому целостность при прохождении через всякие шлюзы, в которых происходит языковая перекодировка символов или преобразование концов строк и т.д. В результате данного кодирования все байты сообщения будут иметь такие значения, которые в дальнейшем не будут модифицированы почтовым транспортом.Согласно спецификации, в Quoted-Printable байты должны быть представлены в соответствии со следующими правилами:
- Каждый байт, кроме тех, которые используются для обозначения конца строки, может быть представлен с помощью двух шестнадцатеричных цифр, предваряемых знаком "=". При написании шестнадцатеричных цифр с A по F должны использоваться заглавные буквы. Кроме тех случаев, когда нижеследующие правила позволяют альтернативное кодирование, данное правило является обязательным.
- Байты с десятичным значением с 33 по 60 и с 62 по 126 МОГУТ быть представлены ASCII-символами, соответствующими этим значениям (с '!' по '<' и с '>' по '~').
- Пробел в кодированной строке может быть заменен на символ подчеркивания "_".
- Байты со значениями 9 и 32 МОГУТ быть представлены как ASCII-символы "Табуляция" и "Пробел", но НЕ ДОЛЖНЫ быть представлены так в конце строки. Везде, где они представлены соответствующими ASCII-символами, за ними должен следовать символ, имеющий графическое изображение (печатный символ). В конце же строки символы табуляции и пробела должны быть представлены в соответствии с правилом #1, так как некоторые почтовые транспорты могут убирать пробелы в конце строки.
- Конец строки в тексте письма должен быть представлен (в соответствии с RFC 822) последовательностью CRLF. Так как в каноническом представлении текста не требуется визуального отображения символов конца строки, в Quoted-Printable не используется видимых символов для обозначения конца строки.
- В соответствии со спецификацией Quoted-Printable, длина строки не должна превышать 76 символов. В противном случае используется "мягкий" перевод строки, представимый знаком равенства. Например, если исходная строка имела вид:
Если программист в девять утра уже на работе, значит он там же и ночевал.
то в Quoted-Printable encoding он может быть представлена следующим образом:
Если программист в девять утра =
уже на работе, значит =
он там же и ночевал.
Это обеспечивает механизм восстановления исходной длины строки пользовательским почтовым агентом.
Читать статью целиком »
Просмотров: 4169 | Комментариев: 1