PHP - 检查字符类型和长度并修剪前导零

时间:2014-02-18 22:17:58

标签: php string

我有这个代码运行良好,只是询问是否有更好,更短的方法来做到这一点:

$sString = $_GET["s"];

if (ctype_digit($sString) == true) {
    if (strlen($sString) == 5){
        $sString = ltrim($sString, '0');
    }
}

此代码的目的是从搜索查询中删除前导零,然后将其传递给搜索引擎(如果它是5位数)。具体情况是A)所有数字,B)长度等于5,C)它有前导零。

更好/更短意味着执行时间...

2 个答案:

答案 0 :(得分:2)

$sString = $_GET["s"];

if (preg_match('/^\d{5}$/', $sString)) {
    $sString = ltrim($sString, '0');
}

这个更短(并在你的问题中做出一些假设not clear)。但是,较短的并不总是更好。这里牺牲了可读性,以及我猜的一些性能(在单次执行中可以忽略不计,但在紧密循环中运行时可能会“昂贵”)等等。你要求“更好,更简短的方法它“;那么你需要定义“更好”和“更短”。代码的行/字符更短?执行时间更短?更好,更可读?应用“最佳实践”更好吗?

编辑:

所以你添加了以下内容:

  

此代码的目的是从搜索中删除前导零   在将其传递给搜索引擎之前进行查询(如果它是5位数)。该   确切的情况是A)所有数字,B)长度等于5,和C)它有   领先的零。

A)好的,这样可以解决问题(你确定不会要求像'+'或' - '这样的字符吗?我认为这些'输入'会是(5位)invoicenumber,产品编号等等?)

B)如何处理长度为1,2,3,4,6,7,...... 28的输入? 97?没有?保持输入完好无损?

  

更好/更短意味着执行时间...

你能解释为什么要“优化”这一小段代码吗?除非你在紧密循环中运行数千次,否则优化它的效果可以忽略不计。 (嘟about premature, optimization, root, evil。您希望“优化”这段代码的“收益”是什么?

我还没有对其进行分析/测量,但我的(有教养的)猜测是我的preg_match在执行时间方面比原始代码更“昂贵”。但是,就代码而言,它 “更短”(但请参见上文关于牺牲可读性等)。

长话短说:这段代码不值得优化*;任何I / O,数据库查询等都将“花费”一百甚至几千倍。首先优化

*除非您尽可能“优化”其他所有内容(即使这样,当以另一种方式编写时,数据库查询可能更有效,因此执行计划效率低或可能保存I / O使用(更多)缓存等。)。一个毫秒(最好)你将要保存优化这些代码的更好的价值是值得的!即便如此,您可能还需要考虑切换到更好的硬件,其他平台或其他编程语言。

编辑2:

我已经 quick'n'dirty “描述了”您的代码:

$start = microtime(true);

for ($i=0; $i<1000000;$i++) {
  $sString = '01234';
  if (ctype_digit($sString) == true) {
    if (strlen($sString) == 5){
      $sString = ltrim($sString, '0');
    }
  }
}

echo microtime(true) - $start;

输出:0.806390047073 因此, 100万(!)迭代的时间为0.8秒。我的代码,“profiled”以同样的方式:

$start = microtime(true);

for ($i=0; $i<1000000;$i++) {
  $sString = '01234';
  if (preg_match('/^\d{5}$/', $sString)) {
    $sString = ltrim($sString, '0');
  }
}

echo microtime(true) - $start;

输出:1.09024000168 所以,它更慢。正如我猜测/预测的那样。

注意我明确提到“quick'n'dirty”:为了获得良好/准确的分析,你需要更好的工具,如果你使用穷人的分析方法,就像我上面演示的那样至少要确保你在几十次运行中平均你的数字等,以确保你的数字是一致和可靠的。

但是,在最坏的情况下,任何一种解决方案都需要小于0,0000011才能运行。如果这段代码运行“每天数万次”(假设为100.000次),如果你把它降到0,你将在一整天内保存0.11秒如果这个0.11秒是一个问题是你手头有更大的问题,而不是这几行代码。这不值得“优化”(地狱,它甚至不值得讨论;你和我在这个问题上来回的时间至少在50年内不会被“收回”)。

这里学到的经验教训: 的 Measure / Profile before optimizing!

答案 1 :(得分:0)

稍短一些:

if (ctype_digit($sString) && strlen($sString) == 5) {
        $sString = ltrim($sString, '0');
}

如果您想要“数字” 0-9或“数值”,也可能是-1,+ 0123.45e6,0xf4c3b00c,0b10100111001等也很重要..在这种情况下使用is_numeric

我猜你也可以这样做来删除0:

$sString = (int)$sString;