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

PHP-检查字符类型和长度并修剪前导零,php,string,Php,String,我有一个很好用的代码,只是想看看是否有更好、更短的方法: $sString = $_GET["s"]; if (ctype_digit($sString) == true) { if (strlen($sString) == 5){ $sString = ltrim($sString, '0'); } } 此代码的目的是在将搜索查询传递给搜索引擎(如果是5位数和)之前,从搜索查询中删除前导零。确切的情况是A)所有数字,B)长度等于5,C)它有前导零 更好/更短

我有一个很好用的代码,只是想看看是否有更好、更短的方法:

$sString = $_GET["s"];

if (ctype_digit($sString) == true) {
    if (strlen($sString) == 5){
        $sString = ltrim($sString, '0');
    }
}
此代码的目的是在将搜索查询传递给搜索引擎(如果是5位数和)之前,从搜索查询中删除前导零。确切的情况是A)所有数字,B)长度等于5,C)它有前导零

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

更短一点:

if (ctype_digit($sString) && strlen($sString) == 5) {
        $sString = ltrim($sString, '0');
}
如果需要“数字”0-9或“数值”,也很重要,可能是-1、+0123.45e6、0xf4c3b00c、0B101001111001等。。在这种情况下,使用
是数字的

我想您也可以这样做来删除0s:

$sString = (int)$sString;
这是简短的(并且在你的问题中做出了一些假设)。然而,越短越好。这里牺牲了可读性,以及一些性能(在一次执行中可以忽略,但在紧密循环中运行时可能“代价高昂”)等等。您要求“更好、更短的方法来实现”;然后你需要定义“更好”和“更短”。代码行/字符是否较短?执行时间更短?更好的阅读方式?更好的“大多数最佳实践”应用

编辑: 因此,您添加了以下内容:

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

A) 好的,这就清楚了(你确定不需要像“+”或“-”这样的字符吗?我假设这些“输入”将是像(5位)InvoiceNumber、ProductNumber之类的东西?)

B) 对于长度为1、2、3、4、6、7、。。。28? 97? 没有什么?保持输入完整

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

你能解释一下为什么要“优化”这段小代码吗?除非您在一个紧密的循环中运行这数千次,否则优化它的效果将是微不足道的。(喃喃自语)。在“优化”这段代码时,您希望“获得”什么

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

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

*除非您已经尽可能地“优化”了所有其他内容(即使如此,当以另一种方式编写数据库查询时,它可能会更高效,因此执行计划更高效,或者可以使用(更多)缓存等来保存I/O)。你将要节省的毫秒(最多)的时间优化这段代码最好是值得的!即使这样,你可能需要考虑切换到更好的硬件、另一个平台或其他编程语言。 编辑2: 我已经快速“分析”了你的代码:

$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;
输出:
1.09024000168
所以,它的速度较慢。正如我猜测/预测的那样

请注意,我明确提到了“quick'n'dirty”:为了获得良好/准确的评测,您需要更好的工具,如果您确实使用了我在上面演示的穷人评测方法,那么至少要确保您的平均数超过几十次,以确保您的数据是一致和可靠的

但是,在最坏的情况下,这两种解决方案的运行时间都少于00000011。如果这段代码“每天运行数万次”(假设为100.000次),那么如果将其降到0,您将在一整天内节省整整0.11秒如果这0.11秒是一个问题,那么您手头有一个更大的问题,而不是这几行代码。这根本不值得“优化”(见鬼,这甚至不值得讨论;你和我在这件事上来回奔波的时间至少在50年内不会“赚回来”)

从中吸取的教训:

请解释一下你到底想做什么?我们需要复制精确的行为吗?所以当输入6位数字时,
$sString
保持不变?您希望如何处理指数(
e
)或负片等。?一个简单的
if(preg_match('/^\d{5}$/',$sString)){
也许可以…现在你在代码后面添加了两段:B)1,2,4,6,28位数字会发生什么?保持机智?关于更好的/更短的==执行时间:你为什么会在意?这种“转换”是在一个紧密的循环中完成了数千次吗?的效果(micro!)在大多数情况下(如果不是全部的话),优化这一点是可以忽略的。“我想你也可以只做
(int)$sString;
”:您可以将变量类型更改为
int
,这样可以将变量名称更改为
$sString
以外的其他名称,或者将其保留为字符串,并使用类似
ltrim(…,'0');
(IMHO)的构造作为副作用.话虽如此:无论如何都是;我建议您避免使用它,或者确保您使用与场景不匹配的.string时应该保持不变。它将一天运行数万次,只是尽可能优化。请参阅我的第二次编辑。它不值得优化(见鬼,这根本不值得讨论;你和我发表这篇文章的时间至少在50年内不会“赚回来”)你是否偶然知道如何在JavaScript中做到这一点?从两个不同的地方开始搜索,其中一个是使用JavaScript来传递字符串。我不能修改它,因为它进入搜索引擎,所以这是禁止的。我被迫在客户端和Selc之间进行这些修改。h引擎。为什么要麻烦使用JS将“负载”卸载到客户端?永远不要相信用户输入。客户端可以禁用JS,甚至只是更改U中的值
$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;
$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;