Добрый день, возникла проблема такого характера. Используется SQLite, мне нужно сортировать дату на русской локализации(с английской все ок отрабатывает) Фишка в том, что дата хранится в базе, типом поля "TEXT"(насколько я знаю тип "Date"-нету в SQLite). Сайт изначально писал не я, мне нужно сделать доработки. Принцип такой, человек через админку вручную может добавить какую-то новость. В поле "Дата добавления:", они ручками пишут дату какую хотят. Они могут написать 13 сентября 2018, или 13 сИнтября 2018, не важно. Как работает код: $media = $db->exec('SELECT * from media WHERE lang=1'); lang 1 = русская локализация. В общем, в переменной $media лежит такой вот массив:
[1] => Array
(
[id] => 28
[lang] => 1
[img] => ../uploads/media/posts/prrrrrrr.png
[title] => Кasdasd
[description] => Гasdasdasd
[source] => МинФин
[s_img] => ../uploads/media/posts/2018-02-20-11-39-48.png
[s_link] => google.ru
[date] => 29 Декабря, 2017
)
И так далее. Таких новостей там штук 6-7. Как отсортировать поле date? Надеюсь все понятно объяснил. Спасибо за помощь.
могут написать 13 сентября 2018, или 13 сИнтября 2018
Как отсортировать поле date?
Можно сначала производить преобразование дат в один формат, (в том числе и не корректных, вида сИнтября), и потом сортировать полученный массив. Публикую решение для PHP>=7.
Массив с разными датами:
$arr = array(
array(
'id' => 28,
'lang' => 1,
'img' => '../uploads/media/posts/prrrrrrr.png',
'title' => 'Кasdasd',
'description' => 'Гasdasdasd',
'source' => 'МинФин',
's_img' => '../uploads/media/posts/2018-02-20-11-39-48.png',
's_link' => 'google.ru',
'date' => '29 Декабря, 2017'
),
array(
'id' => 28,
'lang' => 1,
'img' => '../uploads/media/posts/prrrrrrr.png',
'title' => 'Кasdasd',
'description' => 'Гasdasdasd',
'source' => 'МинФин',
's_img' => '../uploads/media/posts/2018-02-20-11-39-48.png',
's_link' => 'google.ru',
'date' => '30 Октября, 2017'
),
array(
'id' => 28,
'lang' => 1,
'img' => '../uploads/media/posts/prrrrrrr.png',
'title' => 'Кasdasd',
'description' => 'Гasdasdasd',
'source' => 'МинФин',
's_img' => '../uploads/media/posts/2018-02-20-11-39-48.png',
's_link' => 'google.ru',
'date' => '01 Января, 2018'
)
);
Корректировка дат:
$arr = array_map(function($item){
$date = &$item['date'];
$patt = [
'~январ[ья]~iu',
'~ф[ие]врал[ья]~iu',
'~марта?~iu',
'~апрел[ья]~iu',
'~ма[йя]~iu',
'~июн[ья]~iu',
'~июл[ья]~iu',
'~августа?~iu',
'~с[еи]нтябр[ья]~iu',
'~октябр[ья]~iu',
'~ноябр[ья]~iu',
'~д[еи]кабр[ья]~iu',
'~[\s,]+~'
];
$repl = [
'01', '02', '03', '04', '05', '06',
'07', '08', '09', '10', '11', '12', '.'
];
$date = preg_replace($patt, $repl, $date);
$date = (new DateTime($date))->format('Y.m.d');
return $item;
}, $arr);
Сортировка по ключу 'date':
array_multisort(array_column($arr, 'date'), SORT_NUMERIC, $arr);
Вывод по возростанию:
var_dump($arr);
Или по убыванию:
var_dump( array_reverse($arr) );
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости