假设我有两个字符串。
$needle = 'AGUXYZ';
$haystack = 'Agriculture ID XYZ-A';
我想计算$needle
中$haystack
中出现的字符的频率。{1}}在$haystack
中,有字符'A'(两次),'X','Y'和'Z',所有这些都在针中,因此结果应为5(区分大小写) )。
在PHP中是否有任何功能,或者我必须自己编程吗?
提前致谢!
答案 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";
你得到:
答案 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