Есть у меня заметка о полезных командах в терминале Linux, вот решил завести еще заметку о полезных функций
php, буду ее постоянно пополнять.
Вот так можно вычислить разницу во времени, а именно сколько дней, часов, минут, секунд между двух промежутками времени и вывести в удобном формате.
$start = new DateTime("12:15");
$end = new DateTime("15:13");
$interval = $start->diff($end)->format("%H:%I:%S");
echo $interval;
На выводе мы получим
02:58:00, если в формате вывода указать %i то получим минуты без ведущего нуля.
Перевести секунды в часы минуты секунды можно при помощи
gmdate
gmdate('H:i:s', 999);
На выходе получим 00:16:39
Если нам нужно сохранить полученные данные для дальнейшего импорта можно использовать функцию
var_export, допустим у нас есть массив
$country, записать его в файл можно следующим образом
file_put_contents('import.php','<?php $country = ' . var_export($country, true) . ';');
Для использования подключаем файл require или include и пользуемся
$country.
Можно еще так
file_put_contents('import.php','<?php return ' . var_export($country, true) . ';');
Тогда при подключении сразу будет возвращен массив.
Так же можно использовать
serialize и
unserialize
Записать данные в файл
file_put_contents($filename, serialize($country))
Получить
$country = unserialize(file_get_contents($filename));
Сортировка массива по значениям ключей
php 7.1
usort($array, function ($item1, $item2) {
return $item2['key'] <=> $item1['key'];
});
php 5.6
usort($events, function ($a, $b) {
if ($a['sort'] == $b['sort']) {
return 0;
}
return ($a['sort'] < $b['sort']) ? -1 : 1;
});
Перевод строчного времени
14 января 2019
или
14 янв 2019
если убрать пробелы
14января2019
то работать тоже будет в Unix Time при помощи ICU
$offset = date_create()->getOffset() / -3600;
$timezone = 'Etc/GMT' . ($offset > 0 ? '+'.$offset : (string)$offset);
$fmt = new IntlDateFormatter(
'ru_RU',
IntlDateFormatter::SHORT,
IntlDateFormatter::SHORT,
$timezone,
IntlDateFormatter::GREGORIAN,
'd MMMM y'
);
Сделать из многомерного массива одномерный в одну строку
call_user_func_array('array_merge', $arrIn);
Поиск в многомерном массиве
$key = array_search('needle', array_column($array, 'column'));
Но имейте ввиду:
array_column создаст новый массив из ключей
column и если у вас заданные ключи, то данный метод может вам вернет не то что вы ожидаете.
Получить множественные вхождения
needle в многомерном массиве, просто меняем местами параметры
$keys = array_keys(array_column($array, 'column'), 'needle');
Провел пару тестов, все равно самый быстрый поиск в многомерном массиве из 10к элементов это
foreach, так же пробовал array_column выносить в отдельну переменную скорости это не прибавляет
Результаты тестов
php 7.1
Use #array_search, array_column as var# search ID 8414
Time: 0.00206 Seconds
Use #array_search# search ID 8414
Time: 0.00344 Seconds
Use #foreach# search ID 8414
Time: 0.00238 Seconds
php 7.2
Use #array_search, array_column as var# search ID 8414
Time: 0.00380 Seconds
Use #array_search# search ID 8414
Time: 0.00549 Seconds
Use #foreach# search ID 8414
Time: 0.00256 Seconds
php 5.6
Use #array_search, array_column as var# search ID 8414
Time: 0.00662 Seconds
Use #array_search# search ID 8414
Time: 0.00459 Seconds
Use #foreach# search ID 8414
Time: 0.00333 Seconds
Для больших массивов используйте foreach
foreach ($array as $key => $value) {
if($value['id'] == 'needle){
$result = $key;
break;
}
}
Комментарии ()