我想写一个返回计数器数组的函数。也就是说,给定整数的数组$A
,其中整数在范围(0...$m)
内,它应该返回大小为$m + 1
的数组,其中每个索引具有该索引号在$A
中的出现次数。
例如,如果:
$A = array(1, 4, 2, 2, 4, 2);
$m = 4;
它应该输出:
array(0, 1, 3, 0, 2)
我想知道PHP中是否有一个内置函数可以做到这一点。
在python中,它看起来像:
def counting(A, m):
n = len(A)
count = [0] * (m + 1)
for k in xrange(n):
count[A[k]] += 1
return count
你可以试试这个:
$a = array(1, 4, 2, 2, 4, 2);
$m = 4;
function counting(Array $a, $m){
// Create our result array
$result = array();
// Make sure m is an integer for version before PHP 7, otherwise return an empty array
if(!is_int($m))
return $result;
// Get the count of each occurence in the array
$counts = array_count_values($a);
// Loop through each number of m
for($i=0; $i<=$m; $i++)
$result[$i] = isset($counts[$i]) ? $counts[$i] : 0;
return $result;
}
var_dump(counting($a, $m))
:的结果
array(5) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(3)
[3]=>
int(0)
[4]=>
int(2)
}
尝试以下代码
function count_array($array,$m){
// count values
$count_values = array_count_values($array);
// loop for $m times
for($i=0;$i<=$m;$i++){
// check if there exits a key in the array
if(array_key_exists($i,$count_values)){
$result_array[$i] = $count_values[$i];
}else{
$result_array[$i] = 0;
}
}
return $result_array;
}
$A = array(1, 4, 2, 2, 4, 2);
$m = 4;
$result = count_array($A,$m);
输出:
Array
(
[0] => 0
[1] => 1
[2] => 3
[3] => 0
[4] => 2
)
新版本:
$result = array_replace(array_fill(0, $m+1, 0),
array_slice(array_count_values($A), 0, $m-1, true));
- 将长度为
$m+1
的零数组替换为$A
到$m
的值计数
原始版本:
$result = array_fill(0, $m+1, 0);
foreach($A as $i) {
if(isset($result[$i])) {
$result[$i]++;
}
}
- 创建长度为
$m+1
的零的$result
数组 - 循环数组
$A
并递增$A
值的$result
索引
显然,如果你想要一个函数,只需将代码包装在:
function counting($A, $m) {
//code
return $result;
}