Работает над тем, как преобразовать номерную часть номера в Великобритании в год рег.
Цель состоит в том, чтобы взять, например, 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 для такого рода вещей).
Я исправил пропущенную точку с запятой и возвратил $ date, и она, кажется, работает как задумано
<?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);
?>