Шпаргалка php

Шпаргалка php

Сравнение работы функций:

Немного интересных моментов

Список опций командной строки - пример:

$ php -r "echo PHP_INT_MAX;"

Динамичное использование переменных

$zx = 123;
$с = 'x';
echo ${'z'.$с};// 123

Динамичное использование функции

$isfunc = 'image'.$format;

@$isfunc($idest,$path_cache,$quality);

Странные пробелы

Обнаружил странные символы, оказалось это пробелы (1 - 2 - 3), оказывается символ пробела иногда представляет собой не код ASCII 32, а код ASCII 160 (0xa0) в кодировке ISO 8859-1 или UTF-8. Сделано это было для того, чтобы люди могли печатать текст с пробелами, но у которого точно не будет автоматического переноса на другую строку между словами, например 100 км.

// удалить пробельные символы можно так:

$text = preg_replace("/\s+/u", " ", $text);

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

Неочевидные мержи массивов

Ниже видно, что поведение может быть разным из-за использования числовых или строковых ключей у объединяемых массивов:

valuesarray_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(0 => 1);
$second = array('bar' => 1);
array(2) {
    0 => int(1)
    "bar" => int(1)
}
array(2) {
    0 => int(1)
    "bar" => int(1)
}

Выводы:

  • + схлопывает массивы по ключу (нестрогое сравнение), после схлопывания берет значение из первого массива
  • array_merge схлопывает массивы по нечисловому ключу (нестрогое сравнение), после схлопывания берет значение из второго массива

Строгая типизация

Нетипичное преобразование

Кодphp < 7.1php >= 7.1
<?php
$array = '';
$array[1] = 3;
var_dump($array);
array(1) {
    [1]=>int(3)
}
string(2) " 3"

isset или array_key_exists

Этот вопрос задают многие себе, но разница в этих функциях весьма существенна.

$array = array(1=>null);

isset($array[1]);// вернет false и это плохо, ведь не всегда нам важно значение, иногда мы хотим знать, есть ли ключ

array_key_exists(1, $array);// вернет true и это хорошо

Теперь попробуем со строкой

$foo = '123';// string

isset($foo[1]);// вернет true - и вроде бы хорошо, но это редкий случай, когда нужно проверить наличие символа в строке по номеру

// а теперь представьте ситуацию, когда вы ожидали массив, а пришла строка, ну вы поняли, isset в этом случае подвел вас, и чтобы вы не попали в такую ситуацию, используйте:

array_key_exists(1, $foo);// вернет NULL и это хорошо, так же сгенерирует предупреждение: Warning: array_key_exists() expects parameter 2 to be array, string given

Как видите, лучше применять array_key_exists, однако isset намного быстрее.

Максимальное кол-во ключей в 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

Готово.

Иногда бывает полезно

Проксируем http-заголовки текущего запроса


$headers = '';
foreach ($_SERVER as $key => $value) {
    if (strpos($key, 'HTTP_') === 0 && $key != 'HTTP_HOST') {
        $key = strtolower(strtr(substr($key, 5), '_', '-'));
        $headers .= $key . ': ' . $value . "\r\n";
    }
}

$opts = array(
    'http'=>array(
        'method'=>"GET",
        'header'=> $headers,
    )
);

$xml = @file_get_contents('http://site.ru/detect', false, stream_context_create($opts));

Находим имя файла - через последнее значение массива

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

еще про регулярки: 1 - 2

Удачки!

Источник: 1


18.08.2009 14:28

Комментарии

Не хватает функции по работе с mysql. А так норм.
Popo | 06.05.2010 08:27
Почему нет ссылки на оригинал? (no)
Костец | 26.05.2011 17:54