24 марта 2011, 12:45
PHP: strtolower, strtoupper и кириллица
Эти функции на кириллицу просто так не обращают внимания. Строки остаются без изменений, печаль и т. д. В данном случае могут помочь mb_* мультибайтовые аналогичные функции, но если их нет, нужно просто правильно поставить локаль, и простая функция заработает как нужно.
setlocale(LC_ALL, 'ru_RU'); $name = strtolower($name);
2 комментария20 марта 2011, 23:35
PHP: sort multiple array (ASC, DESC)
function array_orderby(){ $args = func_get_args(); $data = array_shift($args); foreach ($args as $n => $field) { if (is_string($field)) { $tmp = array(); foreach ($data as $key => $row) $tmp[$key] = $row[$field]; $args[$n] = $tmp; } } $args[] = &$data; call_user_func_array('array_multisort', $args); return array_pop($args); } $results = array_orderby ($results, "P", SORT_DESC, "GD", SORT_DESC);
В похапе 5.3 мы получим болт а не сортировку, потому пришлось искать замену, и первое что приглянулось, это вот такой код с анонимными функциями и усорт
function sort_multi_array ($array, $key){ $keys = array(); for ($i=1;$i<func_num_args();$i++) { $keys[$i-1] = func_get_arg($i); } // create a custom search function to pass to usort $func = function ($a, $b) use ($keys) { for ($i=0;$i<count($keys);$i++) { if ($a[$keys[$i]] != $b[$keys[$i]]) { return ($a[$keys[$i]] < $b[$keys[$i]]) ? -1 : 1; } } return 0; }; usort($array, $func); return $array; }
Здесь мы получим сортировку АСК по всем ключам, что бы сделать обратную используем аррай_реверс, а что бы ключи работали в функции — нужно подумать, может когда будет нужно переделаю, на данном этапе мне достаточно этого.
чиирз
17 марта 2011, 10:46
PHP: превращаем слово единственного числа в множественное
Нужно было, быстро на коленке стряпать такую вот функцию. Изначально она была сделана по примерам возможных слов, и приняла такой вид:
Взглянув на это, стало как-то печально, особенно если учитывать что примеров может быть намного больше, взял и автоматизировал/оптимизировал:
Вот так родился такой монстрик ;) А сами окончания наверное правильнее будет передавать в функцию, хотя если они останутся в ней, база нарастёт быстрее.
function make_multiple($word) { $word = trim($word); $lst1 = substr($word,-1);$rest1 = substr($word,0,-1); $lst2 = substr($word,-2);$rest2 = substr($word,0,-2); $lst3 = substr($word,-3);$rest3 = substr($word,0,-3); if ($lst3 == "нки") $word = $rest3."нков"; elseif ($lst2 == "ки" || $lst2 == "ка") $word = $rest2."ок"; elseif ($lst2 == "ры") $word = $rest2."р"; elseif ($lst2 == "ия") $word = $rest2."ий"; elseif ($lst2 == "рь") $word = $rest2."рей"; elseif ($lst1 == "ы") $word = $rest1."ов"; return $word; }
Взглянув на это, стало как-то печально, особенно если учитывать что примеров может быть намного больше, взял и автоматизировал/оптимизировал:
function make_multiple($word) { $word = trim($word); // массив возможных вариантов $ends = array( "нки" => "нков", "ки" => "ок", "ка" => "ок", "ры" => "р", "ия" => "ий", "рь" => "рей", "ы" => "ов" ); // ищем самое большое окончание, то есть его длину $itrs = max(array_map('strlen', array_keys($ends))); $poly = array(); // строим массив этих окончаний, и слов без них for ($i = $itrs; $i > 0 ; $i--) { // в таком виде что бы избежать циклов в цикле $poly[$i] = array(substr($word,-$i),substr($word,0,-$i)); } // строим нужно слово, когда найдём сопадение foreach ($ends as $what => $to) { if ($poly[strlen($what)][0] == $what) { return $poly[strlen($what)][1].$to; } } return $word; }
Вот так родился такой монстрик ;) А сами окончания наверное правильнее будет передавать в функцию, хотя если они останутся в ней, база нарастёт быстрее.
10 марта 2011, 13:49
Мускул апдейт, ORDER BY RAND() не работает / not work
После обновления мускула, просто перестал работать такой запрос, все время одно и тоже число :)
Вместо NOW() можно вставить и UNIX_TIMESTAMP(), но блин, может и не помочь, если часто обращаться.
SELECT * FROM your_table ORDER BY RAND() LIMIT 1; #Теперь нужно так: SELECT * FROM your_table ORDER BY RAND(NOW()) LIMIT 1;
Вместо NOW() можно вставить и UNIX_TIMESTAMP(), но блин, может и не помочь, если часто обращаться.
3 марта 2011, 16:36
Универсальный print_r
Окончательный ремейк будет выглядеть вот-так:
if (!function_exists('printr')) { function printr($array) { $args = func_get_args(); if (count($args) > 1) { foreach ($args as $values) printr($values); } else { if (is_array($array) || is_object($array)) { echo "<pre>"; print_r($array); echo "</pre>"; } else echo $array; } } } printr($arr1,$arr2);
28 февраля 2011, 17:01
UFT8 и PHP
Казалось бы, как только начинаешь использовать мультибайт, тебя спасут теже функции, только с mb_ в начале, оказалось показалось %).
В них желательно не забывать указывать какую именно кодировку вы используете
Для почитать на досуге, советую:
PS: нашёл у Тормоза в блоге. И к нему встречный вопрос, почему урл-заглушка в ДАОС не туда ведёт? :)
В них желательно не забывать указывать какую именно кодировку вы используете
mb_substr($var,0,99,'utf-8')Что-то типа такого, и да, мануалы в помощь.
Для почитать на досуге, советую:
PS: нашёл у Тормоза в блоге. И к нему встречный вопрос, почему урл-заглушка в ДАОС не туда ведёт? :)
30 января 2011, 22:53
Firefox CSS3 render fail (scroll lag)
На работе я разбаловался довольно мощным компом, потому многих вещей я просто не замечал. Этой весной моему домашнему бучеку будет 5 лет. Я им вполне доволен, 17» экран, 125фпс в ку3 (на настройках для игры) — но, фокс 3.6.13 очень лагает, когда на странице есть цсс3 градиентики и бокс-шадовс. Он просто реально умирает, и проц 100%. В остальных браузерах, вебкиты, говнооперы и ИЕ все ок, «ТАКИХ» лаг нет.
Что печально, это никак не лечится, разве что реально мощным железом. Наверное не зря «эпл» выбрала такой путь, ведь их сафари без производительности очень лажовое говно, так же как айтюнс и куча-куча прочего.
Частичной панацеей для бокс-шадов есть такая конструкция:
, ну а градиенты картинками, чего очень не хочется.
зы: и ещё, о цсс3 — для инпутов в ФФ до сих пор бордер-радиус не применяются, пока им не сменишь их бордер на любой другой.
Что печально, это никак не лечится, разве что реально мощным железом. Наверное не зря «эпл» выбрала такой путь, ведь их сафари без производительности очень лажовое говно, так же как айтюнс и куча-куча прочего.
Частичной панацеей для бокс-шадов есть такая конструкция:
.shadow {-moz-border-image: url("/imgs/shadow.png") 10 / 3px;}Где картинка выглядит вот-так
, ну а градиенты картинками, чего очень не хочется.зы: и ещё, о цсс3 — для инпутов в ФФ до сих пор бордер-радиус не применяются, пока им не сменишь их бордер на любой другой.
27 января 2011, 16:22
Обновления скриптов
- Заканчивая курить мануал по мускулу, и продолжая обновлять старые проекты новыми ЦМСками, всплыло пару багов, и добавилось фич — в итоге обновил вчерашний скрипт.
- Ещё переписал Регексп-тестер для PHP
- Так же апнул свою коллекцию утилиток
27 января 2011, 12:29
Mysql show create
mysql> show create database AAA; +----------+-----------------------------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------------------------+ | AAA | CREATE DATABASE `AAA` /*!40100 DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin */ | +----------+-----------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show create table charset_test2; +---------------+------------------------------------------------------------------------------+ | Table | Create Table | +---------------+------------------------------------------------------------------------------+ | charset_test2 | CREATE TABLE `charset_test2` ( `str` varchar(20) collate cp1251_bin default NULL, `str2` varchar(20) character set cp1251 default NULL ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin | +---------------+------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
26 января 2011, 19:02
PHP&MYSQL:Сравнение нескольких таблиц в БД и генерация скрипта обновления
Полгодика назад я написал артикль на тему сравнение таблиц в двух БД (и больше), основная идея которого была в том, что бы быстро сравнить 2 таблицы одинаковой системы с разными версиями и обновить старую БД. Делал всё руками, так как изменений было не много.
А тут настал час, когда нужно проделать тоже, но руками это будет адски долго. Уделив 2 часа на курение мускул-синтаксиса, я на коленке написал, так сказать, версию 2.0 :)
Полная генерация «апдейт ескуель»:
А тут настал час, когда нужно проделать тоже, но руками это будет адски долго. Уделив 2 часа на курение мускул-синтаксиса, я на коленке написал, так сказать, версию 2.0 :)
Полная генерация «апдейт ескуель»:
- альтер чендж
- альтер адд
- криейт тейбл
- адд индексес
- ремув индексес
- сам УИ импрувементс
25 января 2011, 11:35
PHP: get google.PR end yandex.QI (тИЦ)
25 января 2011, 11:13
javascript: выколиглаз
20 января 2011, 17:58
Прикол с аддоном IE Tab Plus
Дебажив сайты, случайно обнаружил, что у меня на всех сайтах грузятся одни и те же скрипты, которых я как бы не заказывал, а именно:
зы: я помню, о том что бы расписать как работает анимация в цсс3, сделаю это на выходных :)
- htt ps://www.superfish.com/ws/sfw.jsp?clientVersion=1.2.0.7&dlsource=ietab&userId=RzSKuZipQ5KcdowsVZukzg&statsReporter=false
- htt ps://www.superfish.com/ws/js/sf_conduit.js?ver=4.0.1
- htt ps://ajax.googleapis.com/ajax/libs/dojo/1.5.0/dojo/dojo.xd.js
- htt ps://ajax.googleapis.com/ajax/libs/dojo/1.5.0/dojo/io/script.xd.js
- htt ps://ajax.googleapis.com/ajax/libs/dojo/1.5.0/dojo/window.xd.js
- htt ps://www.superfish.com/ws/getSupportedSitesJSON.action?ver=2.1&callback=SF_isURISupported
зы: я помню, о том что бы расписать как работает анимация в цсс3, сделаю это на выходных :)
14 января 2011, 12:53
Динамические субдомены из субфолдеров :)
Обяснение:
Пример:
Создаете папку в папке субдоменов имя папки будет соответствовать субдомену.
RewriteEngine on Options +FollowSymlinks +Indexes RewriteBase/ RewriteCond %{HTTP_HOST} !^www\.ваш сайт хостинга\.ваш домен хостинга \.ru$ RewriteCond %{HTTP_HOST} (www\.)?(.*)\.ваш сайт хостинга\.ваш домен хостинга \.ru$ RewriteCond %{REQUEST_URI} !^(/)?папка субдоменов/ RewriteRule ^(.*)$ /папка субдоменов/%2/$1
Пример:
RewriteEngine on Options +FollowSymlinks +Indexes RewriteBase / RewriteCond %{HTTP_HOST} !^www\.site\.ru$ RewriteCond %{HTTP_HOST} (www\.)?(.*)\.site\.ru$ RewriteCond %{REQUEST_URI} !^(/)?sub/ RewriteRule ^(.*)$ /sub/%2/$1
Создаете папку в папке субдоменов имя папки будет соответствовать субдомену.
14 января 2011, 11:28
CSS3: Очень клёвый пример анимации
13 января 2011, 9:34
«Обратный» паттерн
var oppositeOf = { 'up' : 'down', 'down' : 'up', 'left' : 'right', 'right' : 'left', 'black' : 'white', 'white' : 'black' }; oppositeOf['left']; // => 'right'
12 января 2011, 12:37
Немножко чая
;(function(w) { var d = w.document, g = d.getElementById; var cup = g("tea-cup"); if (!cup) return; if (cup.className.indexOf("black") >= 0) cup.appendChild(d.createElement("sugar")); cup.style.visibility = "hidden"; })(window);
11 января 2011, 23:40
CSS3: transition
Транзишон — образно говоря, плавный переход значений свойств на промежутке времени. Появился в свежих браузерах ФФ4, ВебКиты, Жопера 11+. Применим в паре с псевдо-классами, например :hover.
Объявление имеет вид:
Пример:
ps: взято с хабра.
Объявление имеет вид:
// on webkit base a { -webkit-transition-property: background-color; -webkit-transition-duration: 0.5s; -webkit-transition-timing-function: ease; } // or a { -webkit-transition: all 0.5s ease; }
Пример:
a.foo { padding: 5px 10px; background-color: #69f; color: #000; -webkit-transition: all 0.5s ease; } a.foo:hover { background-color: #33f; color: #fff; }
ps: взято с хабра.
8 декабря 2010, 11:55
Полезные онлайн тулзы
Собрал всё в одном месте. Полезные ИМХО для меня :)
Если есть что туда добавить, буду рад выслушать.
Если есть что туда добавить, буду рад выслушать.
7 декабря 2010, 13:26
PHP: finish end tags in piece of HTML (close HTML tags)
Иногда нужно вывести кусок html, не весь, и что бы не сломать дизайн, многие «разработчики» (помню даже в яндексе такое видел), вставляют такой код:
Как говорится — это пиздец, потому рекомендую велосипед ниже, так как времени изобретать свой не нашлось :)
</p></li></ul></td></tr></th></table></div>
Как говорится — это пиздец, потому рекомендую велосипед ниже, так как времени изобретать свой не нашлось :)
/** * close all open xhtml tags at the end of the string * * @param string $html * @return string * @author Milian Wolff <mail@milianw.de> */ function closetags($html) { #put all opened tags into an array preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result); $openedtags = $result[1]; #put all closed tags into an array preg_match_all('#</([a-z]+)>#iU', $html, $result); $closedtags = $result[1]; $len_opened = count($openedtags); # all tags are closed if (count($closedtags) == $len_opened) { return $html; } $openedtags = array_reverse($openedtags); # close tags for ($i=0; $i < $len_opened; $i++) { if (!in_array($openedtags[$i], $closedtags)){ $html .= '</'.$openedtags[$i].'>'; } else { unset($closedtags[array_search($openedtags[$i], $closedtags)]); } } return $html; }
