

Список опций командной строки - пример:
$ 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
)Ниже видно, что поведение может быть разным из-за использования числовых или строковых ключей у объединяемых массивов:
| 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(0 => 1); $second = array('bar' => 1); | array(2) { 0 => int(1) "bar" => int(1) } | array(2) { 0 => int(1) "bar" => int(1) } |
Выводы:
Нетипичное преобразование
| Код | php < 7.1 | php >= 7.1 |
| <?php $array = ''; $array[1] = 3; var_dump($array); | array(1) { [1]=>int(3) } | string(2) " 3" |
Этот вопрос задают многие себе, но разница в этих функциях весьма существенна.
$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-запроса приходят в 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
Комментарии