PHP计算另一个字符串中字符串的字符出现次数

时间:2011-01-19 13:59:06

标签: php string count character

假设我有两个字符串。

$needle = 'AGUXYZ';
$haystack = 'Agriculture ID XYZ-A';

我想计算$needle$haystack中出现的字符的频率。{1}}在$haystack中,有字符'A'(两次),'X','Y'和'Z',所有这些都在针中,因此结果应为5(区分大小写) )。

在PHP中是否有任何功能,或者我必须自己编程吗?

提前致谢!

9 个答案:

答案 0 :(得分:20)

您可以计算原始字符串的长度以及没有这些字符的字符串的长度。它们之间的差异是匹配数量。

基本上,

$needle = 'AGUXYZ';
$haystack = 'Agriculture ID XYZ-A';

这是完成工作的部分。在一行。

$count = strlen($haystack) - strlen(str_replace(str_split($needle), '', $haystack));

说明:第一部分是不言自明的。第二部分是字符串的长度,而$needle字符串中没有字符。这是通过用空字符串替换$needle中任何字符的每个匹配项来完成的。

为此,我们使用str_split$needle拆分为一个数组,每个项目都有一个字符。然后将其传递给str_replace。它用空字符串替换$search数组中每个项目的每个出现。

回声,

echo "Count = $count\n";

你得到:

  

Count = 5

答案 1 :(得分:6)

试试这个;

function count_occurences($char_string, $haystack, $case_sensitive = true){
    if($case_sensitive === false){
        $char_string = strtolower($char_string);
        $haystack = strtolower($haystack);
    }

    $characters = str_split($char_string);
    $character_count = 0;
    foreach($characters as $character){
        $character_count = $character_count + substr_count($haystack, $character);
    }
    return $character_count;
}

使用;

$needle = 'AGUXYZ';
$haystack = 'Agriculture ID XYZ-A';
print count_occurences($needle, $haystack);

您可以将第三个参数设置为false以忽略大小写。

答案 2 :(得分:4)

没有处理字符集的内置函数,但您只需在循环中使用substr_count函数:

<?php
    $sourceCharacters = str_split('AGUXYZ');
    $targetString = 'Agriculture ID XYZ-A';
    $occurrenceCount = array();

    foreach($sourceCharacters as $currentCharacter) {
        $occurrenceCount[$currentCharacter] = substr_count($targetString, $currentCharacter);
    }

    print_r($occurrenceCount);
?>

答案 3 :(得分:3)

没有具体方法可以做到这一点,但这种内置方法肯定可以帮助您:

$count = substr_count($haystack , $needle);

编辑:我刚刚报告了一般substr_count方法..在您的特定情况下,您需要为$ needle内的每个字符调用它(感谢@Alan Whitelaw)

答案 4 :(得分:1)

如果您对角色分布不感兴趣,可以使用正则表达式

echo preg_match_all("/[$needle]/", $haystack, $matches);

返回完整模式匹配的数量(可能为零),如果发生错误则返回FALSE。上面的solution offered by @thai应该明显更快。


如果角色分布很重要,您可以使用count_chars

$needle = 'AGUXYZ';
$haystack = 'Agriculture ID XYZ-A';

$occurences = array_intersect_key(
    count_chars($haystack, 1),
    array_flip(
        array_map('ord', str_split($needle))
    )
);

结果将是一个数组,其中键是字符的ASCII值 然后,您可以使用

进行迭代
foreach($occurences as $char => $amount) {
    printf("There is %d occurences of %s\n", $amount, chr($char));
}

您仍然可以将$occurences数组传递给array_sum来计算总数。

答案 5 :(得分:0)

substr_count会让你走近。但是,它不会做个别角色。因此,您可以遍历$needle中的每个字符并在计算总数时调用此函数。

答案 6 :(得分:0)

有一个PHP函数substr_count来计算字符串中字符的实例数。将它扩展为多个字符将是微不足道的:

function substr_multi_count ($haystack, $needle, $offset = 0, $length = null) {
    $ret = 0;

    if ($length === null) {
        $length = strlen($haystack) - $offset;
    }

    for ($i = strlen($needle); $i--; ) {
        $ret += substr_count($haystack, $needle, $offset, $length);
    }

    return $ret;
}

答案 7 :(得分:0)

我将做类似的事情: 将字符串拆分为字符(str_split),然后使用array_count_values,获取每个字符的数组,发生的次数。

    $needle = 'AGUXYZ';
        $string = "asdasdadas asdadas asd asdsd";
        $array_chars = str_split($string);
        $value_count = array_count_values($array_chars);
        for($i=0;$i<count($needle);$i++)
           echo $needle[$i]. " is occur " . 
          ($value_count[$needle[$i]] ? $value_count[$needle[$i]] : '0')." times";

答案 8 :(得分:0)

我有一个递归方法来克服这个问题:

function countChar($str){

  if(strlen($str) == 0) return 0;

  if(substr($str,-1) == "x") return 1 + countChar(substr($str,0,-1));

  return 0 + countChar(substr($str,0,-1));

}

  echo countChar("xxSR"); // 2
  echo countChar("SR"); // 0
  echo countChar("xrxrpxxx"); // 5