Ctrl +  Позднее

24 марта 2011, 12:45

PHP: strtolower, strtoupper и кириллица

Эти функции на кириллицу просто так не обращают внимания. Строки остаются без изменений, печаль и т. д. В данном случае могут помочь mb_* мультибайтовые аналогичные функции, но если их нет, нужно просто правильно поставить локаль, и простая функция заработает как нужно.
setlocale(LC_ALL, 'ru_RU');
$name = strtolower($name);

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

После обновления мускула, просто перестал работать такой запрос, все время одно и тоже число :)
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_ в начале, оказалось показалось %).
В них желательно не забывать указывать какую именно кодировку вы используете
mb_substr($var,0,99,'utf-8')
Что-то типа такого, и да, мануалы в помощь.

Для почитать на досуге, советую:



PS: нашёл у Тормоза в блоге. И к нему встречный вопрос, почему урл-заглушка в ДАОС не туда ведёт? :)
php   utf8

30 января 2011, 22:53

Firefox CSS3 render fail (scroll lag)

На работе я разбаловался довольно мощным компом, потому многих вещей я просто не замечал. Этой весной моему домашнему бучеку будет 5 лет. Я им вполне доволен, 17» экран, 125фпс в ку3 (на настройках для игры) — но, фокс 3.6.13 очень лагает, когда на странице есть цсс3 градиентики и бокс-шадовс. Он просто реально умирает, и проц 100%. В остальных браузерах, вебкиты, говнооперы и ИЕ все ок, «ТАКИХ» лаг нет.

Что печально, это никак не лечится, разве что реально мощным железом. Наверное не зря «эпл» выбрала такой путь, ведь их сафари без производительности очень лажовое говно, так же как айтюнс и куча-куча прочего.

Частичной панацеей для бокс-шадов есть такая конструкция:
.shadow {-moz-border-image: url("/imgs/shadow.png") 10 / 3px;}
Где картинка выглядит вот-так http://deer.org.ua/images/shadow.png, ну а градиенты картинками, чего очень не хочется.

зы: и ещё, о цсс3 — для инпутов в ФФ до сих пор бордер-радиус не применяются, пока им не сменишь их бордер на любой другой.

27 января 2011, 16:22

Обновления скриптов

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 :)

Полная генерация «апдейт ескуель»:
  • альтер чендж
  • альтер адд
  • криейт тейбл
  • адд индексес
  • ремув индексес
  • сам УИ импрувементс


25 января 2011, 11:35

PHP: get google.PR end yandex.QI (тИЦ)

Обновил скрипт, что и как смотреть в старой статье.


25 января 2011, 11:13

javascript: выколиглаз

Вставьте этот код в адресную строку :)




20 января 2011, 17:58

Прикол с аддоном IE Tab Plus

Дебажив сайты, случайно обнаружил, что у меня на всех сайтах грузятся одни и те же скрипты, которых я как бы не заказывал, а именно:
  • 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, а именно IE Tab Plus.
зы: я помню, о том что бы расписать как работает анимация в цсс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.

Объявление имеет вид:
// 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;
}
Ctrl +  Ранее