繁体   English   中英

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

[英]PHP substr when the string starts with a 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似乎失败并且不返回任何内容。 我该如何克服呢?

首先,您使用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);
?>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM