【问题标题】:Get count of substring occurrence in an array获取数组中子字符串出现的次数
【发布时间】:2011-11-30 02:52:54
【问题描述】:

我想计算一个子字符串在数组中出现的次数。这是一个 Drupal 站点,所以我需要使用 PHP 代码

$ar_holding = array('usa-ny-nyc','usa-fl-ftl', 'usa-nj-hb', 
                    'usa-ny-wch', 'usa-ny-li');

我需要能够调用像foo($ar_holding, 'usa-ny-'); 这样的函数并让它从$ar_holding 数组中返回3。我知道in_array() 函数,但它返回字符串第一次出现的索引。我需要该函数来搜索子字符串并返回一个计数。

【问题讨论】:

    标签: php arrays search


    【解决方案1】:

    你可以使用preg_grep():

    $count = count( preg_grep( "/^usa-ny-/", $ar_holding ) );
    

    这将计算以“usa-ny-”开头的值的数量。如果要在任何位置包含包含字符串的值,请删除插入符号 (^)。

    如果你想要一个可以用来搜索任意字符串的函数,你也应该使用preg_quote()

    function foo ( $array, $string ) {
        $string = preg_quote( $string, "/" );
        return count( preg_grep( "/^$string/", $array ) );
    }
    

    【讨论】:

      【解决方案2】:

      如果你需要从字符串的开头搜索,下面的工作:

      $ar_holding = array('usa-ny-nyc','usa-fl-ftl', 'usa-nj-hb', 
                          'usa-ny-wch', 'usa-ny-li');
      
      $str = '|'.implode('|', $ar_holding);
      
      echo substr_count($str, '|usa-ny-');
      

      它利用implode 函数将所有数组值与| 字符之间(和第一个元素之前)连接起来,因此您可以使用搜索词搜索此前缀。然后substr_count 做脏活。

      | 充当控制字符,因此它不能是数组中值的一部分(事实并非如此),只是说以防您的数据发生变化。

      【讨论】:

        【解决方案3】:
        $count = subtr_count(implode("\x00",$ar_holding),"usa-ny-");
        

        \x00 几乎可以肯定,通过将数组连接在一起不会导致匹配的重叠(唯一可能发生的情况是您正在搜索空字节)

        【讨论】:

        • 如果数组包含像“usa-ny-foobar-usa-ny-whatever”这样的值,这可能会返回比预期更大的计数。诚然,在这个例子中这似乎不太可能,但值得注意。 (如果你只想要锚定匹配,hakre 在搜索字符串中包含分隔符的技巧是有效的。)
        【解决方案4】:

        我认为没有任何理由使这项任务过于复杂。

        每次以搜索字符串开头的值时,迭代数组并将计数加 1。

        代码:(演示:https://3v4l.org/5Lq3Y

        function foo($ar_holding, $starts_with) {
            $count = 0;
            foreach  ($ar_holding as $v) {
                if (strpos($v, $starts_with)===0) {
                    ++$count;
                }
            }
            return $count;
        }
        
        $ar_holding = array('usa-ny-nyc','usa-fl-ftl', 'usa-nj-hb', 
                            'usa-ny-wch', 'usa-ny-li');
        echo foo($ar_holding, "usa-ny-");  // 3
        

        或者如果您不想声明任何临时变量:

        function foo($ar_holding, $starts_with) {
            return sizeof(
                array_filter($ar_holding, function($v)use($starts_with){
                     return strpos($v, $starts_with)===0;
                })
            );
        }
        

        【讨论】:

          猜你喜欢
          • 2010-10-20
          • 2011-04-03
          • 2018-12-19
          • 1970-01-01
          • 2011-01-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多