【问题标题】:What is the fastest way to check amount of specific chars in a string in PHP?在 PHP 中检查字符串中特定字符数量的最快方法是什么?
【发布时间】:2017-01-12 17:55:34
【问题描述】:

所以我需要检查字符串中特定集合的字符数量是否高于某个数字,最快的方法是什么?

例如,我有一个长字符串“some text & some text & some text + 更多 + 更多...等等。”我需要检查是否有 r 多于下一个符号中的 3 个:[&,.,+]。因此,当我遇到这些字符之一的第 4 次出现时,我只需要返回 false 并停止循环。所以我想创建一个这样的简单函数。但我想知道 php 中是否有任何本机方法来做这样的事情?但我需要一些函数,它不会浪费时间解析字符串直到最后,因为字符串可能很长。所以我认为像 count_chars 这样的正则表达式和函数不适合那种工作......

有什么建议吗?

【问题讨论】:

    标签: php string charsequence


    【解决方案1】:

    我不知道 native 方法,我认为count_chars 可能与您将获得的一样接近。但是,滚动自定义解决方案会相对简单:

    $str = 'your text here';
    $chars = ['&', '.', '+'];
    $count = [];
    $length = strlen($str);
    $limit = 3;
    for ($i = 0; $i < $length; $i++) {
        if (in_array($str[$i], $chars)) {
            $count[$str[$i]] += 1;
            if ($count[$str[$i]] > $limit) {
                break;
            }
        }
    }
    

    数据的实际来源也可能会有所不同。例如,如果它来自一个文件,那么您可以利用fread 的第二个参数在while 循环内一次只读取x 个字节。

    寻找最快的方法 可能是一个过于宽泛的问题,因为 PHP 有很多与字符串相关的函数;其他解决方案可能使用strstrstrpos 等...

    【讨论】:

      【解决方案2】:

      未对其他解决方案进行基准测试,但 http://php.net/manual/en/function.str-replace.php 传递一组选项会很快。有一个可选参数返回替换的计数。检查那个号码

       str_replace ( ['&','.','+'], '' , $subject , $count  )
      
       if ($count > $number ) {
      

      【讨论】:

        【解决方案3】:

        好吧,我所有的想法都是错误的,我的期望被真实的测试压垮了。 RegExp 似乎比使用简单符号检查循环的自制函数快 2 到 7 倍(使用不同的字符串)。

        代码:

        // self-made function:
        function chk_occurs($str,$chrs,$limit){
            $r=false;
            $count = 0;
            $length = strlen($str);
            for($i=0; $i<$length; $i++){
                if(in_array($str[$i], $chrs)){
                    $count++;
                    if($count>$limit){
                        $r=true;
                        break;
                    }
                }
            }
            return $r;
        }
        
        // RegExp i've used for tests:
        preg_match('/([&\\.\\+]|[&\\.\\+][^&\\.\\+]+?){3,}?/',$str);
        

        当然它的工作速度更快,因为它是对本机函数的一次调用,但即使是包装到函数中的相同代码的工作速度也快 2 到 ~4.8 倍。

        //RegExp wrapped into the function:
        function chk_occurs_preg($str,$chrs,$limit){
            $chrs=preg_quote($chrs);
            return preg_match('/(['.$chrs.']|['.$chrs.'][^'.$chrs.']+?){'.$limit.',}?/',$str);
        }
        

        附:我没有费心检查 cpu-time,只是测试通过 microtime(true); 测量的 200k 迭代循环的 walltime,但这对我来说已经足够了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-06
          • 1970-01-01
          • 2011-08-27
          • 1970-01-01
          • 2012-12-27
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多