When handling very large numbers in PHP, you'll notice they get cut off at hexadecimal 7FFFF FFFF.
Oh yeah! I notice, blyad, of course! Klassno pridumali, chuvaki!
When handling very large numbers in PHP, you'll notice they get cut off at hexadecimal 7FFFF FFFF.
Oh yeah! I notice, blyad, of course! Klassno pridumali, chuvaki!
Это была последняя капля.
isset — Determine if a variable is set and is not NULL
$foo = array["bar" => NULL];
var_dump(isset($foo["bar"])); // FALSE
Интересно, они жопой думали, когда придумывали функцию isset? IS SET! Элемент массива с ключом bar IS SET и он равняется блядь NULL. А с ключом qwfpqwfp IS NOT SET и он ничему не равнятеся. Неужели это, блядь, настолько неочевидно? Да у меня глаза сейчас вытекли, когда я это увидел. Ёбаный в рот, ебаный в рот, я искал баг, а это, блядь, фича! Мне больше делать нечего как под вечер в цикле проверки элементы массива с NULL пропускать потомучто их как будто бы нету. Ёбаные дибилы. Ебаные дибилы. Ебаные дибилы тратят мое время на тупую хуйню.
На дворе 21 век, а функцию двунаправленной обратимой транслитерации на основе ГОСТ 16876-71 я так и не нашел! Поэтому написал собственную.
<?php
/**
* Функция обратимой транслитерации на основе ГОСТ 16876-71
* @author http://space1000.zxcv.one
*/
function translit_url($text,$decode = false)
{
// Split text into array of unicode chars.
preg_match_all('/./u', $text, $text);
$text = $text[0];
$simplePairs = array(
'а' => 'a' , 'л' => 'l' , 'у' => 'u' ,
'б' => 'b' , 'м' => 'm' , 'т' => 't' ,
'в' => 'v' , 'н' => 'n' , 'ы' => 'y' ,
'г' => 'g' , 'о' => 'o' , 'ф' => 'f' ,
'д' => 'd' , 'п' => 'p' ,
'и' => 'i' , 'р' => 'r' ,
'А' => 'A' , 'Л' => 'L' , 'У' => 'U' ,
'Б' => 'B' , 'М' => 'M' , 'Т' => 'T' ,
'В' => 'V' , 'Н' => 'N' , 'Ы' => 'Y' ,
'Г' => 'G' , 'О' => 'O' , 'Ф' => 'F' ,
'Д' => 'D' , 'П' => 'P' ,
'И' => 'I' , 'Р' => 'R' ,
);
$complexPairs = array(
'ж' => 'zh' , 'ч' => 'ch' , 'х' => 'kh' ,
'з' => 'z' , 'ц' => 'c' , 'к' => 'k' ,
'я' => 'ja' ,
'щ' => 'shh' , 'ю' => 'ju' ,
'э' => 'eh' , 'ш' => 'sh' , 'й' => 'jj' ,
'е' => 'e' , 'с' => 's' , 'ё' => 'jo' ,
'Ж' => 'ZH' , 'Ч' => 'CH' , 'Х' => 'KH' ,
'З' => 'Z' , 'Ц' => 'C' , 'К' => 'K' ,
'Я' => 'JA' ,
'Щ' => 'SHH' , 'Ю' => 'JU' ,
'Э' => 'EH' , 'Ш' => 'SH' , 'Й' => 'JJ' ,
'Е' => 'E' , 'С' => 'S' , 'Ё' => 'JO' ,
'Ь' => "^'" , 'Ъ' => "^`" ,
'ь' => "'" , 'ъ' => "`" ,
);
$specialSymbols = array(
"_" => "__",
"-" => "_-",
"'" => "_'",
"`" => "_`",
"^" => "_^",
" " => "-",
);
$translitLatSymbols = array(
'a','l','u','b','m','t','v','n','y','g','o',
'f','d','p','i','r','z','c','k','e','s',
'A','L','U','B','M','T','V','N','Y','G','O',
'F','D','P','I','R','Z','C','K','E','S',
);
$simplePairsFlip = array_flip($simplePairs);
$complexPairsFlip = array_flip($complexPairs);
$specialSymbolsFlip = array_flip($specialSymbols);
$charsToTranslit = array_merge(
array_keys($simplePairs),
array_keys($complexPairs)
);
$translitTable = array();
foreach($simplePairs as $key => $val) $translitTable[$key] = $simplePairs[$key];
foreach($complexPairs as $key => $val) $translitTable[$key] = $complexPairs[$key];
foreach($specialSymbols as $key => $val) $translitTable[$key] = $specialSymbols[$key];
$result = "";
if($decode)
{
$char = array();
$translitDisabled = false;
for($pos = 0; $pos < count($text); $pos++)
{
$char[0] = $text[$pos];
$char[1] = isset($text[$pos+1]) ? $text[$pos+1] : null;
$char[2] = isset($text[$pos+2]) ? $text[$pos+2] : null;
// Decoding specsymbols: [_-'`^ ]
foreach($specialSymbolsFlip as $key => $val)
{
$search = "";
for($j = 0; $j < strlen($key) ; $j++) $search.= $char[$j];
if($search == $key)
{
$result.= $val;
$pos += strlen($key) - 1;
continue 2;
}
}
// Lone '_' symbol disables or enables translitting.
if($char[0] == '_')
{
$translitDisabled = !$translitDisabled;
continue;
}
// When translit is disabled, simply add char to result.
if($translitDisabled)
{
$result.= $char[0];
}
else
{
if(in_array($char[0],$simplePairs))
{
$result.= $simplePairsFlip[$char[0]];
continue;
}
foreach($complexPairsFlip as $key => $val)
{
$search = "";
for($j = 0; $j < strlen($key); $j++) $search.= $char[$j];
if($search == $key)
{
$result.= $val;
$pos += strlen($key) - 1;
continue 2;
}
}
// if nothing up worked
$result.= $char[0];
continue;
}
}
}
else
{
$translitDisabled = false;
foreach($text as $char)
{
if(in_array($char,array_keys($specialSymbols)))
{
$result.= $translitTable[$char];
}
elseif(in_array($char,$charsToTranslit))
{
if($translitDisabled)
{
$result.= "_";
$translitDisabled = false;
}
$result.= $translitTable[$char];
}
else
{
if(!$translitDisabled
&& in_array($char,$translitLatSymbols))
{
$result.= "_";
$translitDisabled = true;
}
$result.= $char;
}
}
}
return $result;
}
Раскопал свой старый годовалой давности фреймворк под php. Потыркался в него, понял почему идея классная, но не взлетит. А дело все в том, что php сам по себе язык скриптовый, а apache сам по себе такой сервер. И любые надстройки над этим всем будут выглядеть громоздко и уродливо. Если хочется фреймворков - надо ставить Node.JS и под него писать. И гораздо лучше использовать инструменты в их традиционном способе выполнения. Пускай даже с недостатками. Сделать из топора бензопилу в любом случае не получится. Лучше уж научиться хорошо пользоваться топором (а там есть свои нюансы).
Я считаю, что параметры в функции должны передаваться через ассоциативные массивы. Сравните сами:
$string = mb_substr($string, -1, 1, 'UTF-8');
и
$str = mb_substr(array( 'string' => $str, 'start' => -1, 'length' => 1, 'encoding' => 'UTF-8' ));
и в PHP-6
$str = mb_substr([ 'string' => $str, 'start' => -1, 'length' => 1, 'encoding' => 'UTF-8' ]);
Но суть поста не в этом, а в том, как вырезать ненужные параметры из массива, чтобы потом сделать, например, extract.
$svn = array_intersect_key($svn,array_flip(array( 'bin','url','username','password' )));
Так гораздо понятнее. Один небольшой шажок в сторону самодокументируемого кода, который, однако, документацию не отменяет.
Вы, конечно, можете возразить, что первый способ самый короткий, и т.д. и т.п., но когда вы используете несколько ЯП, и возвращаетесь через некоторое время к функции, интерфейс которой не помните - вот тут-то жопа и начнется. 90% времени уйдет на просмотр справочников, повторное забывание интерфейса и повторные же просмотры. А если код чужой? И без документации? То-то же.