PHP substr, когда строка начинается с 0

Работает над тем, как преобразовать номерную часть номера в Великобритании в год рег.

Цель состоит в том, чтобы взять, например, 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 не работает и ничего не возвращает. Как мне преодолеть это?

0

Решение

Прежде всего вы используете 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);

Рабочий пример в Codepad

2

Другие решения

Ваш текущий подход неверен, так как он рассматривает вторые 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 для такого рода вещей).

1

Я исправил пропущенную точку с запятой и возвратил $ 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);
?>
0
По вопросам рекламы [email protected]