Работая над тем, как конвертировать номер части британского номерного знака в номер рег года.
Цель состоит в том, чтобы взять, например, 55/03/62
И укажите, как они должны быть: 2005/2003/2012
Мой первоначальный план состоял в следующем:
function convertPlateYearToYYYY($vrmYear) {
$firstDigit = substr($vrmYear, 0, 1);
$secondDigit = substr($vrmYear, 1, 1);
if ($firstDigit == 6) {
$partOne = '1';
} else {
$partOne = '0';
}
$date = "20" . $partOne . $secondDigit;
return $secondDigit;
}
$vrmYear = '05'
echo convertPlateYearToYYYY($vrmYear);
Это отлично работает, но если вы отправляете значение, начинающееся с 0 (как в примере), substr, похоже, терпит неудачу и ничего не возвращает. Как мне это преодолеть?
Прежде всего, вы используете return $secondDigit;
когда я думаю, что вы хотите сделать return $date;
в вашей функции.
Не вдаваясь в дальнейшее обсуждение вашего вопроса, здесь появилось рабочее решение, получающее доступ к первой и второй цифрам вашей строки в виде массива вместо использования substr:
function convertPlateYearToYYYY($vrmYear) {
$firstDigit = $vrmYear[0];
$secondDigit = $vrmYear[1];
if (6 == $firstDigit) {
$partOne = '1';
} else {
$partOne = '0';
}
$date = "20{$partOne}{$secondDigit}";
return $date;
}
$vrmYear = '05';
echo convertPlateYearToYYYY($vrmYear);
Ваш нынешний подход ошибочен, так как он рассматривает последние 6 месяцев пластинчатого года как частный частный случай. Фактически, можно использовать простой бит математики, чтобы рассчитать это по всему диапазону допустимых таблиц в текущей британской системе, без необходимости обрабатывать ведущую цифру специально.
function convert_uk_reg_year_to_yyyy($year)
{
// Normalise year to padded with 1 leading zero, if necessary. This ensures that
// if the input is int(9) instead of string(2) "09" then it will still work as
// expected.
$year = str_pad((int)$year, 2, 0, STR_PAD_LEFT);
// Make sure input is within valid range
if ($year < 0 || $year > 99) {
return false;
}
// Create result
return "20" . ($year[0] % 5) . $year[1];
}
Это использует оператор модуля для вычисления компонента "десятки", а затем просто использует вторую цифру ввода как компонент "единиц".
Это будет работать на каждый год пластинки до конца пропускной способности текущей системы (предполагая, что мы продолжаем использовать эту систему до 2049 года, когда заканчиваются пластины).
PS. да, я обманывал, живя в Великобритании и зная, как работает система номерных знаков. Это станет более интересным, когда вы начнете хотеть обрабатывать старую лидирующую альфа-пластинку, или даже более старые пластины задней-альфа, поскольку они были гораздо более беспорядочными с точки зрения границы между циклами.
К сожалению, это все еще несовершенно, поскольку IIRC новая система действительно начала действовать с 50 пластинами, а не с 00, но это может быть специально обложено. Я не уверен, были ли выпущены ли какие-либо персональные таблички, соответствующие текущей системе, так как совпадение с рисунком плиты не является эффективным решением, особенно учитывая, что пластины могут переноситься между транспортными средствами. Если вы строите что-то, что должно точно знать год автомобиля, к которому прикреплена тарелка, тогда вам нужно использовать данные от DVLA (у кого есть API для такого рода вещей).
Я исправил отсутствующую точку с запятой и вернул дату и, похоже, работает по назначению
<?php
function convertPlateYearToYYYY($vrmYear) {
$firstDigit = substr($vrmYear, 0, 1);
$secondDigit = substr($vrmYear, 1, 1);
if ($firstDigit == 6) {
$partOne = '1';
} else {
$partOne = '0';
}
$date = "20" . $partOne . $secondDigit;
return $date;
}
$vrmYear = '05';
echo convertPlateYearToYYYY($vrmYear);
?>
$vrmYear
после присвоения$vrmYear
. Не подавляйте сообщения об ошибках на своем компьютере разработчика.