Полезные PHP коды — для новичков
При написании кода в PHP есть задачи, которые встречаются чаще остальных или просто как-то выделяются из общего множества. В этой статье поговорим о некоторых из них.
Тут собрана лишь малая часть, и наверное это не последняя статья на тему несложных популярных задачек в PHP. Кроме того, я планирую дополнять эту статью...
В общем, не буду никого ни за что тянуть и перейду сразу к кодам, которые, я надеюсь, будут полезны новичкам: кто что для себя найдет - все ваше 
См. также: Полезные PHP коды — для опытных
Короткая запись операторов присваивания
Когда нужно что-то прибавить, отнять или объединить, то для краткости можно использовать сокращения в операторе = - операторе присваивания:
$a = $a + 1; $a++; $a = $a + 5; $a += 5; $a = $a - $b; $a -= $b; $a = $a . 'текст'; $a .= 'текст';
Время выполнения PHP скрипта
Иногда бывает нужно замерить время выполнения отельного куска кода в PHP. Сделать это не сложно, ниже разберемся как.
Простой вариант
Замерить скорость выполнения какой-то отдельной его части PHP кода, можно с помощью встроенной в PHP функции microtime( true ). Функция вернет UNIX штамп времени в микросекундах. Параметр true говорит функции вернуть число, а не строку, чтобы можно было потом просто отнять одно число от другого.
Логика проста: сначала замеряем текущее время в микросекундах, выполняем код, опять замеряем текущее время и высчитываем разницу времени - эта разница и будет временем выполнения кода. С помощью функции sprintf() форматируем результат в более читаемый формат.
$start = microtime( true ); get_bloginfo( 'homeurl' ); // какой-то код $diff = sprintf( '%.6f sec.', microtime( true ) - $start ); echo "Время выполнения: $diff"; // Время выполнения: 0.000014 sec.
Вариант посложнее, но с доп функциональностью
Для измерения скорости работы PHP кода, когда-то написал такую функцию:
/**
* Считает время выполнения PHP кода (в секундах).
*
* exec_time();
* // код
* echo exec_time('get') .' сек.'; //> 0.03654 сек.
*
* @version 3.4.5
*
* @param string $phase run - включает подсчет: первый раз или после паузы (по умолчанию).
* start - очищает все кэши и включает подсчет - clear & run.
* get - получает разницу, между предыдущим вызовом функции.
* getall|end|stop - получает разницу, между первым вызовом функции (run).
* pause - временная остановка подсчета. exec_time() для продолжения.
* clear - полностью очищает результат. exec_time() для начала нового подсчета.
* @param int $round До скольки знаков после запятой округлять результат.
*
* @return float|void Example 0.03654
*/
function exec_time( $phase = 'run', $round = 6 ){
static $prev_time, $collect;
if( 'start' === $phase ){
$collect = $prev_time = 0;
}
elseif( 'clear' === $phase ){
return $collect = $prev_time = 0;
}
list( $usec, $sec ) = explode( ' ', microtime() );
$mctime = bcadd( $usec, $sec, 8 );
if( $prev_time ){
$exectime = $mctime - $prev_time; // bcsub( $mctime, $prev_time, 8 );
$collect += $exectime; // bcadd( $collect, $exectime, 8 );
}
$prev_time = $mctime;
if( 'pause' === $phase ){
$prev_time = 0;
}
elseif( 'get' === $phase ){
return round( $exectime, $round );
}
elseif( false !== strpos( 'getall end stop', $phase ) ){
return round( $collect, $round );
}
}
Если замеряете отдельные быстрые функции, например: __(), то можно повторять выполнение для наглядности. Например, замерим работу __():
exec_time();
for( $i=1; $i<50000; $i++ ){
$r = __( 'Settings', 'default' );
}
echo exec_time('get') .'сек.'; // 0.51650 сек.
--
Смотрите также, функции подсчета времени выполнения кода в WP:
Округление дробных чисел
Округление до целых
Чтобы округлить число в php существует несколько функций:
-
round($num) - округляет число в большую или меньшую сторону в зависимости от значения дробной части. Если дробная часть больше или равна пяти, то округлит в большую сторону, иначе в меньшую.
-
ceil($num) - независимо от дробной части, округляет в большую сторону.
- floor($num) - независимо от дробной части, округляет в меньшую сторону.
// round echo round( 5.2 ); //> 5 echo round( 5.5 ); //> 6 echo round( 5.6 ); //> 6 // ceil echo ceil( 5.1 ); //> 6 // floor echo floor( 5.9 ); //> 5
Округление до дробных
Для округления чисел, до определенного количество знаков после запятой, используем функцию round(). Во втором параметре нужно указать сколько оставить знаков после запятой.
echo $round = round( 5.555, 1 ); //> 5.6 echo $round = round( 5.555, 2 ); //> 5.56
Округление последнего числа происходит как в математики: если следующее больше или равно 5 то в большую сторону, в остальных случаях в меньшую...
Целая часть и остаток от деления чисел
Чтобы получить целую часть от деления можно воспользоваться функцией intval() или префиксом (int).
$celoe = intval(5 / 2); //> 2 $celoe = (int) (5 / 2); //> 2
Чтобы получить остаток от деления можно воспользоваться оператором %:
$ostatok = (5 % 2); //> 1
Четное число или нет - проверка в PHP (остаток от деления)
Чтобы узнать четное число или нет, нужно разделить его на 2 и проверить нет ли остатка... А для определения остатка от деления используется арифметический оператор — %.
$a = 11;
// есть остаток
if ( $a % 2 ) {
echo '$a не четное';
}
// нет остатка
else {
echo '$a четное';
}
Получаем остаток:
$ostatok = 5 % 2; //> 1 $ostatok = 4 % 2; //> 0 $ostatok = 10 % 6; //> 4
Числа кратные к N или каждый N-ый блок в цикле
Нужно разделить число на число и если остатка нет, то первое число делиться нацело на второе, а значит кратное.
$num = 21;
$n = 3;
if( ! ($num % $n) ){
echo "$num кратно $n";
}
Где применить эту кратность?
Допустим, есть цикл записей и нужно к каждому третьему блоку добавить отдельный css класс. Тут-то кратность нам и поможет.
$i = 1;
foreach( $posts a $post ){
if( ! ($i++ % 3) ){
// каждый третий блок в цикле
}
}
Форматирование чисел (денег) в PHP
Для удобного восприятия числа или денежные велечины, лучше выводить с разеделением тысячных групп. Например 9864 понятнее смотрится так: 9 864. Для такого форматирования в PHP есть готовые фукнции:
- number_format( $number, $decimals = 0 )
- number_format( $number, $decimals = 0, $dec_point = '.' , $thousands_sep = ',' )
Форматирует число с разделением групп.
-
number(обязательный)
Число, которое нужно отформатировать. -
decimals
Сколько знаков после запятой показывать. -
dec_point
Разделитель для дробной части. - thousands_sep
Разделитель тысяч.
-
// английский формат (по умолчанию) echo number_format( 5555 ); //> 5,555 // русский формат echo number_format( 5555, 0, ',', ' '); //> 5 555 // французский формат echo number_format( 5555.55, 2, ',', ' '); //> 5 555,55
Для форматирования с учетом языка сайта в WordPress есть специальная функция number_format_i18n()
Для вывода денежных величин используйте похожую функцию money_format()
Как получить ключи или значения ассоциативного PHP массива
Чтобы получить только ключи или только значения ассоциативного массива можно воспользоваться двумя php функциями: array_keys() и array_values(). Они возвращают простой индексный массив, содержащие все ключи или значения соответственно.
$array = array( 'key_1' => 'val_1', 'key_2' => 'val_2', 'key_3' => 'val_3', 'key_4' => 'val_4', 'key_5' => 'val_5' ); // получение всех ключей массива $keys = array_keys( $array ); /* Array( [0] => key_1 [1] => key_2 [2] => key_3 [3] => key_4 [4] => key_5 )*/ // получение всех значений массива $values = array_values( $array ); /* Array( [0] => val_1 [1] => val_2 [2] => val_3 [3] => val_4 [4] => val_5 )*/
Это может пригодится когда нужно сделать поиск по ключам массива. В PHP такой встроенной функции нет.
Создаем массив из диапазона чисел или букв
Допустим, нужно заполнить пустой массив элементами: числами от 1 до 5 или буквами от a до f.
На такой случай в php есть функция range( $start, $end, $step = 1 ). Она принимает два обязательных и один не обязательный параметр. Обязательные, указывают диапазон, из которого будет заполнен массив, а необязательный определяет шаг между элементами.
$array = range(1, 10);
/* Array(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
)*/
$array = range(5, -5, 2);
/* Array(
[0] => 5
[1] => 3
[2] => 1
[3] => -1
[4] => -3
[5] => -5
)*/
$array = range('a', 'f');
/* Array(
[0] => a
[1] => b
[2] => c
[3] => d
[4] => e
[5] => f
)*/
$array = range('z', 'a', 3);
/* Array(
[0] => z
[1] => w
[2] => t
[3] => q
[4] => n
[5] => k
[6] => h
[7] => e
[8] => b
)*/
Как получить максимальное или минимальное число из массива в PHP
Для определения максимального и минимального числа в php есть две удобные функции: min() и max(). Они могут принимать любое количество чисел и возвращать минимальное или максимально из них.
Также можно передать массив из чисел, тогда мин. или макс. число будет выбрано из значений массива.
// Пример 1 $min = min( 1, 6 ); //> 1 $max = max( 1, 6 ); //> 6 // Пример 2 $min = min( 1, 2, -5, 6, 0, -8, 7 ); //> -8 $max = max( 1, 2, -5, 6, 0, -8, 7 ); //> 7 // Пример 3 - массивы $min = min( [1, 6] ); //> 1 $max = max( [1, 6] ); //> 6
Как получить часть строки (подстроку)
Чтобы получить подстроку можно использовать: substr(), iconv_substr() или mb_substr().
Все эти функции одинаковые, если нужно обрабатывать латиницу. А отличия начинаются когда нужно обработать например кириллицу или другой язык, тут подходят только: mb_substr() и iconv_substr(), потому что в них можно указать кодировку и они работают с символами в указанной кодировке.
Однако нужно знать, что скорость их работы в разы ниже: substr() работает с одинаковой скоростью для строки любой длинны. А вот mb_substr() и iconv_substr() работают тем медленнее чем длине строка в них указывается... В среднем они в 5-10 раз медленнее, однако альтернатив нет, если нужно обработать кириллицу, придется использовать их...
// синтаксис: // mb_substr ( $string, $start, $length, $encoding ) $str = "Поиск текстов"; // 3 символа начиная с третьего (отсчет идет от нуля) $sub_1 = mb_substr( $str, 2, 3 ); // обычно кодировку указывать не обязательно... // Берем подстроку, начиная с первого символа и до третьего с конца $sub_2 = mb_substr( $str, 6, -2, 'utf-8' ); // результат echo $sub_1 .' - '. $sub_2; //> бой - текст
Всевозможные варианты:
// Латиница $str = 'abcdef'; echo substr( $str, 1); // bcdef echo substr( $str, 1, 3); // bcd echo substr( $str, 0, 4); // abcd echo substr( $str, 0, 8); // abcdef echo substr( $str, -1, 1); // f // Кириллица $str = 'абвгдеж'; echo mb_substr( $str, 1); // бвгдеж echo mb_substr( $str, 1, 3); // бвг echo mb_substr( $str, 0, 4); // абвг echo mb_substr( $str, 0, 8); // абвгдеж echo mb_substr( $str, -1, 1); // ж // с указанием кодировки, обычно это не обязательно echo mb_substr( $str, 1, null, 'utf-8'); // бвгдеж echo mb_substr( $str, 1, 3, 'utf-8'); // бвг echo mb_substr( $str, 0, 4, 'utf-8'); // абвг echo mb_substr( $str, 0, 8, 'utf-8'); // абвгдеж echo mb_substr( $str, -1, 1, 'utf-8'); // ж // iconv_substr(), обычно для нее нужно указать кодировку // iconv_* медленнее чем mb_* echo iconv_substr( $str, 1, 9999999, 'utf-8'); // бвгдеж echo iconv_substr( $str, 1, 3, 'utf-8'); // бвг echo iconv_substr( $str, 0, 4, 'utf-8'); // абвг echo iconv_substr( $str, 0, 8, 'utf-8'); // абвгдеж echo iconv_substr( $str, -1, 1, 'utf-8'); // ж
Количество символов в строке
Чтобы посчитать количество символов в строке есть три функции: strlen(), mb_strlen() и iconv_strlen(). Первая это родная функция PHP и она будет правильно работать только для латиницы. Две другие функции работают на основе подключаемого расширения для PHP и нужны для подсчета кириллицы или других языков. В них можно указать кодировку строки.
$str = 'Короткая строка.'; // тут 16 символов // узнаем длину строки echo strlen( $str ); // > 30 echo mb_strlen( $str ); // > 16 echo mb_strlen( $str, 'utf-8' ); // > 16 // iconv_* медленнее чем mb_* echo iconv_strlen( $str ); // > 30 echo iconv_strlen( $str, 'utf-8' ); // > 16
Как посчитать сколько раз встречается одна строка в другой
Чтобы получить количество подстрок входящих в другую строку, можно воспользоваться двумя функциями: substr_count() и mb_substr_count() - для кириллицы.
$str = 'исходная строка для примера подсчета подстрок'; $sub_str = 'стр'; // искомая подстрока // подсчет $count = substr_count( $str, $sub_str ); //> 2 $mb_count = mb_substr_count( $str, $sub_st ); //> 2 $mb_count = mb_substr_count( $str, $sub_str, "UTF-8"); //> 2
Удаление символов внутри строки
Сделать это можно многими способами, но самый простой это функция str_replace():
$str = 'Короткая строка.'; // заменим слово echo str_replace( 'Короткая', 'Длинная', $str ); //> Длинная строка. // удалим точку echo str_replace( '.', '', $str ); //> Короткая строка
Удаление символов на концах строки
Чтобы прочистить концы строки от пробелов, табов и переносов есть функция trim(). Но не все знают что этой функции можно передать второй параметр, чтобы удалить с концов строки указанный символ.
Также, не все знают что есть аналогичные функции:
- rtrim() — удаляет только справа строки
- ltrim() — удаляет только слева строки
Удаление пустых символов на концах строки
$str = ' Короткая строка. '; // Удалим все пустые символы: таб, пробел, перенос echo trim( $str ); // 'Короткая строка.' // Удалим все пустые символы справа echo rtrim( $str ); // ' Короткая строка.' // Удалим слева echo ltrim( $str ); // 'Короткая строка. '
Удаление указанных символов в начале и конце строки
$str = '1122Короткая строка.2211'; // Удалим один символ echo trim( $str, '1' ); // '22Короткая строка.22' // Удалим несколько символов echo trim( $str, '12' ); // 'Короткая строка.' echo trim( $str, '21' ); // 'Короткая строка.' // тоже самое только на концах строки // Удалим справа echo rtrim( $str, '1' ); // '1122Короткая строка.22' echo rtrim( $str, '21' ); // '1122Короткая строка.' // Удалим слева echo ltrim( $str, '1' ); // '22Короткая строка.2211' echo ltrim( $str, '21' ); // 'Короткая строка.2211'
Как перевернуть строку в PHP
Для вывода строки в обратном (реверсивном) порядке есть функция strrev(). Но, как и многие функции она не умеет работать с кириллицей. Альтернативных функций, вроде mb_strlen() нет. Поэтому давайте создадим свою:
// исходная строка
$string_lat = 'some string';
$string_cry = 'какая-то строка';
// переворачиваем
echo strrev( $string_lat ); //> gnirts emos
// переворачиваем строку в кодировке UTF-8
$mb_strrev = '';
for( $i = mb_strlen($string_cry, "UTF-8"); $i >= 0; $i-- ){
$mb_strrev .= mb_substr( $string_cry, $i, 1, "UTF-8" );
}
echo $mb_strrev; //> акортс от-яакак
День недели и месяц по-русски на PHP
В php, функция date(), умеет выводить дату и время в огромном количестве форматов, но, к сожалению, вывод по-русски не предусмотрен. Поэтому для вывода дня недели или месяца по-русски, необходимо написать свою функцию.
Месяц по-русски
/**
* функция для получения названия месяца по-русски.
*
* @param integer [$num_month = false] Номер месяца, необязательный параметр, если параметр не задан,
* то функция вернет название текущего месяца.
* @return string Название месяца
*/
function get_rus_month( $num_month = 0 ) {
// если не задан номер месяца
if( ! $num_month ) {
$num_month = date('n'); // номер текущего месяца
}
// массив с названиями месяцев
$monthes = array('', 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь');
return $monthes[ $num_month ];
}
// пример использования
echo get_rus_month(1); // Январь
echo get_rus_month(); // Апрель
День недели
## получает день недели по-русски
function get_rus_day(){
$days = array('Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота' );
// номер дня недели: с 0 до 6. 0 - воскресенье, 6 - суббота
$num_day = date('w');
return $days[ $num_day ];
}
// пример использования
echo get_rus_day(); //> Среда
-
Есть что добавить? Милости прошу в комментарии...