繁体   English   中英

获取数组中子字符串出现的计数

[英]Get count of substring occurrence in an array

我想计算一个子串在数组中出现的次数。 这是一个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-');这样的函数foo($ar_holding, 'usa-ny-'); 让它从$ar_holding数组返回3。 我知道in_array()函数,但它返回第一次出现的字符串的索引。 我需要函数来搜索子字符串并返回计数。

你可以使用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 ) );
}

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

$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然后执行脏工作。

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

$count = subtr_count(implode("\x00",$ar_holding),"usa-ny-");

\\x00几乎可以肯定,你最终不会因为将数组连接在一起而导致匹配重叠(唯一的一次是它会发生,如果你正在搜索空字节)

我认为没有理由过度复杂化这项任务。

每次从搜索字符串开始值时,迭代数组并将计数加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;
        })
    );
}

暂无
暂无

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

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