39 заметок с тегом

php РСС

5 декабря 2013, 21:22

PHP: array_map AND str_replace

array_map("str_replace",array_fill(0, count($prop), "#ELEMENT_NAME#"), array_map("strip_tags",$prop), $prop);
нужно просто в нужном порядке аргументов (от стр_реплейс), дать 3 массива и все
php

2 августа 2013, 17:29

php: выбираем первый абзац текста (html)

mb_internal_encoding("UTF-8");
$pos2 = 0;
$haystack = $action['content'];
$needle = preg_match("/<\/p>/",$haystack) ? "</p>" : "</div>";
$meta_og = mb_substr($haystack,0, mb_strpos($haystack, $needle));
while (mb_strlen(trim(strip_tags($meta_og))) < 20) {
	$pos1 = mb_strpos($haystack, $needle, $pos2);
	$pos2 = mb_strpos($haystack, $needle, $pos1 + mb_strlen($needle));
	$meta_og = mb_substr($haystack ,$pos1, $pos2-$pos1);
}

ps: современные визвиг-редакторы параграфы оформляют либо p либо div
php   string

21 мая 2013, 10:47

PHP: заменить последнее вхождение слова

function str_lreplace($search, $replace, $subject){
    $pos = strrpos($subject, $search);
    if($pos !== false)    {
        $subject = substr_replace($subject, $replace, $pos, strlen($search));
    }
    return $subject;
}
php   string

12 ноября 2012, 14:07

PHP: мультибайтовою строку в массив с букв (multibyte string to array of letters)

Не думал что может быть такая проблема, но explode(’’,$string) не работал вообще, а mb_split глючил
preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);

Уже почти забыл, как пользоваться движком блога, мде :)
php

11 июня 2012, 16:15

PHP: укоротим текст без обрезки слов

substr($text, 0, strpos($text, ' ', 100));
php

9 июня 2012, 17:10

PHP: функции жрут память, заменим часть

Хорошая статья на эту тему у болка, скопирую «выводы»:
# занесение элемента в массив:
array_push($stack, $element);
$stack[] = $element;

# получение версии ПХП, есть ещё
# PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION, PHP_VERSION_ID и PHP_EXTRA_VERSION
if (phpversion() === "5.0.0") {}
if (PHP_VERSION === "5.0.0") {}

# способ подключения ПХП
if (php_sapi_name() === 'cli') {}
if (PHP_SAPI === 'cli') {}

# проверка существования ключа, но, увы, это не одно и тоже:
# isset не покажет true, если ключ существует, но значение null
if (array_key_exists('key1', $arr) && array_key_exists('key2', $arr)) {}
if (isset($arr['key'], $arr['key2'])) {}

# для массивов, ключи которых не перекрываются (операция «+» добавит только те ключи,
# которые отсутствуют в первом массиве)
$arr = array_merge($arr1, $arr2);
$arr = $arr1 + $arr2;

# операционная система
if (php_uname('s') === 'Darwin') {}
if (PHP_OS === 'Darwin') {}

# получение переменной окружения. Есть отличие: массив $_ENV может быть перезаписан другим кодом,
# при этом реальное значение переменной окружения не изменится, кроме того,
# getevn не сгенерирует предупреждение, если значения с таким ключом нет
if (getenv('VARNAME') === 'value') {}
if ($_ENV['VARNAME'] === 'value') {}
php

5 июня 2012, 14:01

UTF Code points to UTF8

html_entity_decode(preg_replace("/\\\\u([0-9a-fA-F]+)/", "&#x$1;", json_encode($array)), ENT_COMPAT, 'UTF-8');
code points   php   utf8

31 мая 2011, 19:07

PHP: array_key_exists for multidimensional arrays

function array_key_exists_r($needle, $haystack)
{
    $result = array_key_exists($needle, $haystack);
    if ($result) return $result;
    foreach ($haystack as $v) {
        if (is_array($v)) {
            $result = array_key_exists_r($needle, $v);
        }
        if ($result) return $result;
    }
    return $result;
}
php

27 мая 2011, 18:38

PHP: MySQL get FOREIGN KEY

$result = mysql_query("SHOW CREATE TABLE $table_name");
while ($rowI = mysql_fetch_assoc($result, MYSQL_NUM)) {
	if(preg_match_all(
 		'/FOREIGN KEY \(`(.*)`\) REFERENCES `(.*)` \(`(.*)`\)/',
 		$rowI[1],
 		$matchArr)) {
			printr($matchArr);
	}
}	
mysql   php

29 апреля 2011, 14:58

PHP: detect UTF8 :D

function detectUTF8($string)
{
    return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
        )+%xs', 
    $string);

}
php   utf8

14 апреля 2011, 8:33

Новый PHP новые правила :) Лечим быстро растущий еррор_лог

На одном проекте, написанном н-лет назад обновили апачь+пхп+мускул+нгинксс, и скорость толстения логов просто поражала. Например за сутки лог апача из-за ошибок пхп выростал до 2ух гиг :)

За 1 заход простого юзера плюс 1-20МБ, это конечно замечательно, но нужно было как-то «пофиксить». Самым толстым ворнингом был такой:
Warning: strtotime()/strftime()/date() [function.strftime]: It is not safe to rely on the 
system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() 
function. In case you used any of those methods and you are still getting this warning, you most likely 
misspelled the timezone identifier.

Пхп, просто хотел знать дефаулт тайм-зоун, и ругался на все функции которые работают с датой :) В начале «главного» скрипта пишем:
date_default_timezone_set('UTC');


Следующий ворнинг:
PHP Deprecated:  Function ereg()/eregi()/ereg_replace() is deprecated in *

Это значит что, эти функции ereg()/eregi()/ereg_replace() нихт_арбайтен, то есть не работают, вообще. Да, в новом пхп их убили, почитать что убили можно здесь

«-Что же делать?», воскликнет читатель. Есть два пути.
  • заменить все дохлые функции живыми аналогами
    // Все меняем на preg_match
    ereg("\.([^\.]*$)", $this->file_src_name, $extension);
    preg_match("/\.([^\.]*$)/", $this->file_src_name, $extension);
    // да, на preg_match
    $this->file_dst_name_body = ereg_replace("[^A-Za-z0-9_]", "", $this->file_dst_name_body);
    $this->file_dst_name_body = preg_replace("/[^A-Za-z0-9_]/", "", $this->file_dst_name_body);
    // тут появится модификатор regexpа
    eregi("\.([^\.]*$)", $this->file_src_name, $extension);
    preg_match("/\.([^\.]*$)/i", $this->file_src_name, $extension);
  • в настройках включить поддержку старых функций, которая отрубает поддержку новых
    mbstring.func_overload = 7
Если код старый и ТОЛСТы, можно обойтись и заменой в хтакцесс, а если нет, то лучше да ;)
bugs   php

1 апреля 2011, 19:42

PHP: отладка в сложнодоступных местах :)

ob_start();

	print_r(get_defined_vars());
	
$output = ob_get_contents(); 
ob_end_clean();

$f = fopen('output.txt', 'w+');

fwrite($f, $output);
fclose($f);
debug   php

24 марта 2011, 12:45

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

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

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;
} 

Здесь мы получим сортировку АСК по всем ключам, что бы сделать обратную используем аррай_реверс, а что бы ключи работали в функции — нужно подумать, может когда будет нужно переделаю, на данном этапе мне достаточно этого.

чиирз
php

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;
}

Вот так родился такой монстрик ;) А сами окончания наверное правильнее будет передавать в функцию, хотя если они останутся в ней, база нарастёт быстрее.
optimizing   php

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);
php

28 февраля 2011, 17:01

UFT8 и PHP

Казалось бы, как только начинаешь использовать мультибайт, тебя спасут теже функции, только с mb_ в начале, оказалось показалось %).
В них желательно не забывать указывать какую именно кодировку вы используете
mb_substr($var,0,99,'utf-8')
Что-то типа такого, и да, мануалы в помощь.

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



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

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

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

mysql   php

26 января 2011, 19:02

PHP&MYSQL:Сравнение нескольких таблиц в БД и генерация скрипта обновления

Полгодика назад я написал артикль на тему сравнение таблиц в двух БД (и больше), основная идея которого была в том, что бы быстро сравнить 2 таблицы одинаковой системы с разными версиями и обновить старую БД. Делал всё руками, так как изменений было не много.

А тут настал час, когда нужно проделать тоже, но руками это будет адски долго. Уделив 2 часа на курение мускул-синтаксиса, я на коленке написал, так сказать, версию 2.0 :)

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


mysql   php

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

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

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


php
Ctrl +  Ранее