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

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
    $ vrmYear конвертируется в целое число где-то в коде перед вызовом convertPlateYearToYYYY ()? например, intval ($ vrmYear)
  • 1
    Если образец кода извлекается с помощью copy-paste из вашего фактического кода, он не работает, потому что вы забыли $vrmYear после присвоения $vrmYear . Не подавляйте сообщения об ошибках на своем компьютере разработчика.
Теги:
substr

3 ответа

2
Лучший ответ

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

  • 0
    На месте, не думал об использовании строки в качестве массива вместо substr ... :)
  • 1
    Это все еще не очень хорошее решение, поскольку оно перестанет работать через 6 лет (2020 г.).
1

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

0

Я исправил отсутствующую точку с запятой и вернул дату и, похоже, работает по назначению

<?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);
?>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню