Немного интересных моментов
Список опций командной строки - пример:
$ php -r "echo PHP_INT_MAX;"
Динамичное использование переменных
$zx = 123;
$с = 'x';
echo ${'z'.$с};// 123
Динамичное использование функции
$isfunc = 'image'.$format;
@$isfunc($idest,$path_cache,$quality);
Странные символы
// HEX-значение "c2" можно получить через dechex(ord(mb_substr($search,0,1))) а затем добавив к нему \x в итоге "\xc2"
// HEX-значение "A0" можно получить через javascript функцию escape(this.value) а затем добавив к нему \x в итоге "\xA0"
// для mysql SELECT CONV(ORD(SUBSTRING(description,1,1)),10,16) FROM table WHERE id=12345
$search = trim(str_replace("\xc2",' ',str_replace("\xA0",' ', $search)));// избавляем поисковую строку от возможных неправильных символов
$string = str_replace("\xC2\xA0"," ",$string);
SELECT REPLACE(description, '\xc2\xA0', ' ') FROM table WHERE id=12345
Неочевидные ссылки
Осторожнее при работе с ссылками:
$a = array('a','b','c'); foreach ($a as &$v) { } print_r($a); foreach ($a as $v) { echo $v.PHP_EOL; } print_r($a); foreach ($a as &$b) { $b = 'z'; } print_r($a);
Вывод:
Array ( [0] => a [1] => b [2] => c ) a b b Array ( [0] => a [1] => b [2] => b ) Array ( [0] => z [1] => z [2] => z )
Неочевидные мержи массивов
Ниже видно, что поведение может быть разным из-за использования числовых или строковых ключей у объединяемых массивов:
values | array_merge($first, $second) | $first + $second |
$first = array('key' => 'value'); $second = array('key' => 'value'); |
array(1) { "key" => string(5) "value" } |
array(1) { "key" => string(5) "value" } |
$first = array('key' => 1); $second = array('key' => '1'); |
array(1) { "key" => string(1) "1" } |
array(1) { "key" => int(1) } |
$first = array('key' => 1); $second = array('key' => '2'); |
array(1) { "key" => string(1) "2" } |
array(1) { "key" => int(1) } |
$first = array(0 => 'value'); $second = array('0' => 'value'); |
array(2) { 0 => string(5) "value" 1 => string(5) "value" } |
array(1) { 0 => string(5) "value" } |
$first = array(1); $second = array('1'); |
array(2) { 0 => int(1) 1 => string(1) "1" } |
array(1) { 0 => int(1) } |
$first = array(1); $second = array('2'); |
array(2) { 0 => int(1) 1 => string(1) "2" } |
array(1) { 0 => int(1) } |
$first = array('foo' => 1); $second = array('bar' => 1); |
array(2) { "foo" => int(1) "bar" => int(1) } |
array(2) { "foo" => int(1) "bar" => int(1) } |
Выводы:
- + схлопывает массивы по ключу (нестрогое сравнение), после схлопывания берет значение из первого массива
- array_merge схлопывает массивы по нечисловому ключу (нестрогое сравнение), после схлопывания берет значение из второго массива
Строгая типизация
Нетипичное преобразование
Код | php < 7.1 | php >= 7.1 |
<?php $array = ''; $array[1] = 3; var_dump($array); |
array(1) { [1]=>int(3) } |
string(2) " 3" |
Максимальное кол-во ключей в POST-переменной
Столкнулся с проблемой, когда данные POST-запроса приходят в PHP не полностью, а именно 1000 ключей (читай переменных) в сумме.
Исправляем ситуацию:
1. в файле /etc/php5/apache2/php.ini увеличиваем значение переменной max_input_vars
2. в файле /etc/php5/apache2/conf.d/suhosin.ini увеличиваем значение переменной suhosin.post.max_vars и suhosin.request.max_vars
Перезапускаем апач:
# service apache2 restart
Готово.
Иногда бывает полезно
Находим имя файла - через последнее значение массива
$file_name = current(array_reverse(explode('/',dirname(__FILE__))));
Проверка на цифру в строке:
if(preg_match("/[0-9]+/", 'z1x')){
echo 'в строке есть цифра';
}
Удаляем повторяющиеся тегов <br>:
preg_replace('/(?:<br[^>]*>\s*)+/i','<br>', $article);
Удаляем повторяющиеся пробелы:
preg_replace('/[\s]{2,}/', ' ', $article);
Убираем множество повторяющихся тегов B
$article = preg_replace('/(<b>){2,}/i', '<b>', $article);
$article = preg_replace('/(<\/b>){2,}/i', '</b>', $article);
еще про регулярки:
http://dreamhelg.ru/2010/02/15-regular-expression-for-web-developers/
http://php.spb.ru/php/regexp.html
Удачки!
Источник: 1