我想计算一个子串在数组中出现的次数。这是一个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()
函数,但它返回第一次出现的字符串的索引。我需要函数来搜索子字符串并返回计数。
答案 0 :(得分:4)
您可以使用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 ) );
}
答案 1 :(得分:3)
如果您需要从字符串的开头搜索,以下内容有效:
$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
然后做了肮脏的工作。
|
充当控制字符,因此它不能成为数组中值的一部分(不是这种情况),只是说你的数据发生了变化。
答案 2 :(得分:1)
$count = subtr_count(implode("\x00",$ar_holding),"usa-ny-");
\x00
几乎可以肯定你不会因为将数组连接在一起而导致匹配重叠(唯一可能发生的是你正在搜索空字节)
答案 3 :(得分:0)
我没有看到任何使这项任务过于复杂的理由。
每次从搜索字符串开始值时,迭代数组并向计数加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;
})
);
}