PHP-获取数组项的总数,值中包含一个特定的数字序列

时间:2018-07-22 11:50:24

标签: php

因此,基本上,我试图在固定电话和手机号码$ mobile_list(071234567890,02039989435,0781 ...)的列表中计算固定电话号码的数量

$mobile_array = explode(",",$mobile_list);        // turn into an array
$landlines = array_count_values($mobile_array);  // create count variable
echo $landlines["020..."];                      // print the number of numbers

因此,我得到了特定于基本计数的元素功能,但是我看不到在哪里可以指定元素是“开始于”还是“包含”序列。使用以上方法,您只能指定确切的电话号码(显然没有用)。

任何帮助都会很棒!

4 个答案:

答案 0 :(得分:3)

您可以使用array_reduce()来计算以'020'开头的字符串的出现次数

$mobile_list = "02039619491,07143502893,02088024526,07351261813,02095694897";
$mobile_array = explode(',', $mobile_list);

function landlineCount($carry, $item)
{
    if (substr($item, 0, 3) === '020') {
        return $carry += 1;
    }

    return $carry;
}


$count = array_reduce($mobile_array, 'landlineCount');

echo $count;

打印3


我确定OP几个小时前已经完成了他们需要做的事情,但是为了好玩,这里是计算固定电话的一种更快的方法。

我没有发现原始代码正在爆炸字符串的问题。

这不是必需的,您可以只用substr_count()计算子字符串,这可能会漏掉第一个没有逗号的字符串,因此我也用substr()进行了检查。

如果您需要所有数字的总数,您可以再次用substr_count()计算逗号并加一个。

$count = substr($mobile_list, 0, 3) === '020' ? 1 : 0;
$count += substr_count($mobile_list, ",020");
$totalCount = substr_count($mobile_list, ",") + 1;

echo $count;
echo $totalCount;

这里是替补席运行1000次以获得平均值。

https://3v4l.org/Sma66

答案 1 :(得分:3)

我看不出有什么理由先将字符串分解为数组,然后检查每个数组项。
那是对性能的完全浪费!

我建议使用preg_match_all并与单词边界“ 020”匹配。
这意味着“单词”必须以020开头。

$mobile_list = "071234567890,02039989435,0781,020122,123020";

preg_match_all("/\b020\d+\b/", $mobile_list, $m);
var_dump($m);
echo count($m[0]); // 2

https://3v4l.org/ucSDm



我发现的最轻,最快的方法是在“ 020”上爆炸。
返回的数组的未定义项为0,这意味着我们不知道它是否为020,所以我必须手动查看。

$temp = explode(",020", $mobile_list);
$cnt = count($temp);
if(substr($temp[0],0,3) != "020") $cnt--;
echo $cnt;

小规模测试表明这是最快的方法。
https://3v4l.org/rD54d

答案 2 :(得分:-2)

使用array_filter()preg_grep()函数查找包含给定数字序列或以给定数字序列开头的所有数字。

注意:在其他回答中,找到要求查找以给定数字序列开头的值的解决方案,有一种更简便,更好的解决方案。 因为您已经提到-“但是我看不到我可以在哪里指定元素是“开始于”还是“包含”序列。” -我的代码假定您不仅不会在每个项目的字符串开头找到任何出现的序列。

$mobile_list = '02000, 02032435, 039002300, 00305600';
$mobile_array = explode(",",$mobile_list);        // turn into an array
$landlines = array_count_values($mobile_array);  // create count variable
$sequence = '020';                      // print the number of numbers



function filter_phone_numbers($mobile_array, $sequence){
    return array_filter($mobile_array, function ($item) use ($sequence) {
        if (stripos($item, $sequence) !== false) {
            return true;
        }
        return false;
    });
}

$filtered_items = array_unique (filter_phone_numbers($mobile_array, $sequence)); //use array_unique in case we find same number that both contains or starts with sequence

echo count($filtered_items);

或使用preg_grep()

$mobile_list = '02000, 02032435, 039002300, 00305600';
$mobile_array = explode(",",$mobile_list);        // turn into an array
$landlines = array_count_values($mobile_array);  // create count variable
$sequence = preg_quote('020', '~'); ;                      // print the number of numbers



function grep_phone_numbers($mobile_array, $sequence){

     return preg_grep('~' . $sequence . '~', $mobile_array);

}
//use array_unique in case we find same number that both contains or starts with sequence
$filtered_items = array_unique(grep_phone_numbers($mobile_array, $sequence));

echo count($filtered_items);

答案 3 :(得分:-2)

我建议对数据库执行此操作。该数据库旨在管理数据,并且可以比PHP高效得多。您只需将其放入查询中,就可以一次性获得所需结果:

SELECT * FROM phone_numbers WHERE number LIKE '020%'

无论如何,如果您从数据库中获取数据,那么LIKE会为查询增加一点时间,但是花费更少的时间来循环,存储和存储结果。而且,当您返回较小的数据集时,将使用较少的资源。