从OutOfMemory上看到的一个题目,然后看了看其中的代码,结合自己之前的经验理解了一下,觉得代码不错,就放上来了:
<?php $str="asdfgfdas323344##$\$fdsdfg*$**$*$**$$443563536254fas"; //任意长度字符串 //解法一(最方便的解法) $arr=str_split($str); $arr=array_count_values($arr); arsort($arr); print_r($arr); //解法二(用字符本身作为数组下标) $arr=str_split($str); $con=array(); foreach ($arr as $v) { if (!@$con[$v]) { @$con[$v]=1; } else { @$con[$v]++; } } arsort($con); print_r($con); //解法三 $arr=str_split($str); $unique=array_unique($arr); foreach ($unique as $a){ $arr2[$a]=substr_count($str, $a); } arsort($arr2); print_r($arr2);
执行效果如下:
C:>php php_str_char_count.php
Array
(
[3] => 6
[*] => 6
[$] => 6
[4] => 5
[a] => 3
[5] => 3
[f] => 3
[s] => 3
[6] => 2
[2] => 2
[d] => 2
[#] => 2
[] => 1
[g] => 1
)
Array
(
[3] => 6
[*] => 6
[$] => 6
[4] => 5
[a] => 3
[5] => 3
[f] => 3
[s] => 3
[6] => 2
[2] => 2
[d] => 2
[#] => 2
[] => 1
[g] => 1
)
Array
(
[3] => 6
[*] => 6
[$] => 6
[4] => 5
[a] => 3
[5] => 3
[f] => 3
[s] => 3
[6] => 2
[2] => 2
[d] => 2
[#] => 2
[] => 1
[g] => 1
)
上面的那段代码非常精简,下面相当于是对应的繁体版的:
<?php //PHP几个函数的使用 function countStr($str){ $str_array=str_split($str); $str_array=array_count_values($str_array); arsort($str_array); return $str_array; } $str="asdfgfdas323344##$\$fdsdfg*$**$*$**$$443563536254fas"; print_r(countStr($str)); //用字符的值作为数组下标进行统计 function countStr2($str){ $str_array=str_split($str); $result_array=array(); foreach($str_array as $value){//根据字符之前是否出现过来赋值,没有出现设置为1,否则就自加1 if(!$result_array[$value]){ $result_array[$value]=1; }else{ $result_array[$value]++; } } arsort($result_array); return $result_array; } $str="asdfgfdas323344##$\$fdsdfg*$**$*$**$$443563536254fas"; var_dump(countStr2($str)); //这个方法纯粹是解法一的蹩脚版本,先找出所有字符的总类(array_unique),然后再一个一个用substr_count函数统计 function countStr3($str){ $str_array=str_split($str); $unique=array_unique($str_array); $result_array=array(); foreach ($unique as $v){ $result_array[$v]=substr_count($str,$v); } arsort($result_array); return $result_array; } $str="asdfgfdas323344##$\$fdsdfg*$**$*$**$$443563536254fas"; var_dump(countStr3($str)); ?>