просто о сложном


Полезные короткие сниппеты php

tags: php

В силу специфики своего рода занятий мне часто приходится разбирать php код различных разработчиков: коллег по работе, фрилансеров, web студий, авторов фреймворков, cms и т.д. К сожалению, вынужден констатировать, что из программистов, с которыми мне пришлось столкнуться:

  1. 85% склонны решать простые задачи сложными методами;
  2. 10% - "крепкие середнячки", у которых все по учебнику года 20ХХ, который может уже сильно отстать;
  3. примерно 3% - люди "с головой", т.е. перед тем как скопипастить пример из интернета подумают рационально ли его использование;
  4. и наконец около 2% - это прогеры, у которых можно и нужно учиться

Проблема в том, что увидеть код (а тем более с пояснениями) людей из последних 2% весьма сложно. Они очень редко пишут статьи на всяких хабрах, их практически не встретить на тематических форумах. Как бы странно это ни казалось, но подавляющее большинство книг по php написано прогерами из 2-й или, в лучшем случае, 3-й категории.

Ну да ладно, закончу на этом лирическое отступление. Теперь по теме: некоторые примеры кода товарищей из первой категории можно посмотреть здесь, а в этой статье я хочу поделиться грамотными и весьма полезными приемами решения мелких типовых задач (попытался расположить в порядке частотности).

  1. Удаления пустых элементов массива
    удалить все элементы, которые (bool)$value === false:
    $array = array_filter($array);
    удалить только пустые строковые:
    $array = array_diff($array, ['']);

    Нерациональное решение: перебор массива в цикле

  2. Получение расширения файла
    pathinfo('/inc/file.php', PATHINFO_EXTENSION);

    Нерациональное решение: explode на точку, preg_match

  3. Преобразование значений полей MySQL TIMESTAMP, DATE И DATETIME в читабельный вид или php date
    (напомню, что без преобразований MySQL DATE, например, отображается как YYYY-MM-DD, что для русского человека не совсем привычно)
    date_format(date_create($mysql_date), 'd M Y, H:i');
    date_format(date_create($mysql_date), 'd M Y');
    date_format(date_create($mysql_date), 'U'); //(Unix timestamp)

    преобразование даты-времени из любого формата в любой
    DateTime::createFromFormat('d.m.y','11.09.09')->format('d / m / Y');

    Нерациональное решение: чего только не приходилось видеть... чаще всего preg_match с последующей перестановкой, explode('-', $mysql_date) и т.д.

  4. Вычисление разницы между датами
    разница между какой-то датой и сегодняшней в днях:
    DateTime::createFromFormat('d.m.y','11.09.04')->diff(new DateTime)->days;
    между произвольными датами:
    DateTime::createFromFormat('d.m.y','11.09.04')
    ->diff(DateTime::createFromFormat('d.m.y','11.09.05'))->days;

    помним о том, что diff() не выдает отрицательные значения, а о том, что вычитаемое больше скажет свойство invert
    $diff = DateTime::createFromFormat('d.m.y','11.09.14')
    ->diff(DateTime::createFromFormat('d.m.y','11.09.05'));
    if ($diff->invert == 1) //значит первая дата больше второй


    Нерациональное решение: приведение обоих к Unix timestamp -> вычитание -> обратное преобразование к читабельному виду

  5. Определение операционной системы сервера
    на практике обычно сводится к определению "виндовс-не виндовс":
    $is_windows = isset($_SERVER['WINDIR']);
    $is_windows = PHP_SHLIB_SUFFIX === "dll";

    Нерациональное решение: анализ PHP_OS или ещё интересней php_uname(), т.к. там может быть много чего лишнего.

  6. Определение режима работы скрипта
    на практике обычно сводится к определению "CLI-не CLI" (CLI - command line interface):
    $is_cli = PHP_SAPI === 'cli';

  7. Сортировка многомерного массива
    $data = [
    	['id' => 2, 'volume' => 67],
    	['id' => 1, 'volume' => 86],
    	['id' => 6, 'volume' => 77],
    	['id' => 3, 'volume' => 28],
    	['id' => 7, 'volume' => 92],
    	['id' => 5, 'volume' => 77],
    ];
    
    array_multisort(
    	array_column($data, 'id'), SORT_ASC,
    	$data
    );
    
    var_dump($data);
    
    Можно и по нескольким столбцам с нужным порядком:
    array_multisort(
    	array_column($data, 'volume'), SORT_DESC,
    	array_column($data, 'id'), SORT_ASC,
    	$data
    );
    
    Нерациональное решение: перебор массива в цикле с формированием нового массива


Знаете еще примеры? Пишите!

Быть добру!

posted on november 13, 2013, updated on september 08, 2025

Комментарии

Отправка новых комментариев временно отключена. Извините, работаем над этим.


tags cloud