当字符串以0开头时,PHP substr

时间:2014-12-11 15:05:33

标签: php substr

致力于将英国牌照的数字部分转换为注册年度的数字部分。

目的是采取例如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似乎失败并且不返回任何内容。我该如何克服这个问题?

3 个答案:

答案 0 :(得分: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);

Working example in Codepad

答案 1 :(得分: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];
}

Demo

这使用模数运算符来计算出&#34;数&#34;组件,然后简单地使用输入的第二个数字作为&#34;单位&#34;成分

这将适用于当前系统容量结束时的每个平板年份(假设我们继续使用该系统直到2049年,当平板耗尽时)。


PS。是的我生活在英国并且知道车牌系统是如何运作的。当你开始想要处理旧式的前导α板或更老的尾随-α板时,它会变得更有趣,因为它们在循环之间的边界方面更加无序。

不幸的是,这仍然是不完美的,因为IIRC新系统实际上是用50板而不是00来实现的,但这可能是特殊的。我不确定是否有任何与现行系统匹配的个人牌照在它生效之前发行,因此匹配牌照模式并不是一个真正有效的解决方案,特别是考虑到牌照可以在车辆之间转移。如果您正在构建需要准确知道该板当前所连接的汽车年份的东西,那么您需要使用来自DVLA的数据(谁有这种东西的API)。

答案 2 :(得分:0)

我修复了丢失的分号并返回$ 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);
?>