Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Преобразование даты из свободного формата в нужный вид

#php #инспекция_кода #время


При парсинге получаем переменную даты в формате "10 июля 2017", и нужно её записать
в базу msql, соотвественно в формате "2017-07-10".

Я написал, но можно ли мой говнокод оптимизировать?

    

    


Ответы

Ответ 1



$input = "10 июля 2017"; $months = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря']; //------------------------------------------------------ // разбиваем по пробелам $arr = explode(' ', $input); // меняем ключи и значения местами, чтобы можно было искать по названием месяцев // а можно сразу задать ассоциативный массив, // где ключи - названия месяцев значения - номер, чтоб не мудрить $months = array_flip($months); // индекс месяца - это ячейка в массиве $months со значением $arr[1] $newmonth = $months[$arr[1]] + 1; // если индекс меньше 10 - добавляем ноль $newmonth = $newmonth > 9 ? $newmonth : '0'.$newmonth; // результат $output = $arr[2].'-'.$newmonth.'-'.$arr[0]; //------------------------------------------------------ echo $output; без мудрежа $input = "10 мая 2017"; $months = ['января' => '01', 'февраля' => '02', 'марта' => '03', 'апреля' => '04', 'мая' => '05', 'июня' => '06', 'июля' => '07', 'августа' => '08', 'сентября' => '09', 'октября' => '10', 'ноября' => '11', 'декабря' => '12']; //------------------------------------------------------ $arr = explode(' ', $input); $output = $arr[2].'-'.$months[$arr[1]].'-'.$arr[0]; //------------------------------------------------------ echo $output;

Ответ 2



Чуть-чуть расширена задача и не совсем нормальный код ;) function replDate($str) { return preg_replace_callback('%^(\d{1,2})\s(?:(янв)|(фев)|(мар)|(апр)|(ма)|(июн)|(июл)|(авг)|(сен)|(окт)|(ноя)|(дек))\S*\s(\d{4})$%ui', function($matches) { $year = array_pop($matches); array_shift($matches); $day = array_shift($matches); $matches = array_flip($matches); unset($matches['']); $month = array_pop($matches) + 1; return sprintf('%s-%02s-%02s', $year, $month, $day); }, $str); } foreach(['10 июля 2017', '1 янв 2017', '31 май 2017', '8 Июня 2999'] as $d) { var_dump(replDate($d)); } Вывод string(10) "2017-07-10" string(10) "2017-01-01" string(10) "2017-05-31" string(10) "2999-06-08" Тест http://sandbox.onlinephpfunctions.com/code/2e17a72cfc4a42b87afcc4601971ae900e539398

Ответ 3



используйте функцию preg_replace_callback $text = "10 июля 2017"; // функция обратного вызова function new_date($matches) { // как обычно: $matches[0] - полное вхождение шаблона // $matches[1] - вхождение первой подмаски, // заключенной в круглые скобки, и так далее... $month = trim($matches[2]); $month_array = array( "января" => "01", "февраля"=> "02", "марта"=> "03", "апреля"=> "04", "мая" => "05", "июня" => "06", "июля" => "07", "августа" => "08", "сентября" => "09", "октября" => "10", "ноября" => "11", "декабря" => "12", ); //если введен месяц не правильно, вывожу 01, а вы у себя сами решите как быть $newmonth = isset($month_array[$month]) ? $month_array[$month] : '01'; return $matches[3].'-'.$newmonth.'-'.$matches[1]; } echo preg_replace_callback( "|^(\d{2})(.*)(\d{4})$|", "new_date", $text);

Комментариев нет:

Отправить комментарий