你可以对计数数组执行
array_reduce
操作以找到最大值,但是由于
array_reduce
不允许访问可迭代对象的键,所以你需要进行额外的转换。
相反地,我建议你通过扩展SplMaxHeap
来构建自己的MaxHeap
。
class MaxHeap extends SplMaxHeap {
public function compare($a, $b) {
if (current($a) < current($b))
return -1;
elseif (current($a) > current($b))
return 1;
else
return 0;
}
}
然后我们可以将其用作这样 - 答案显示
[ 7 => 4 ]
,这意味着:
7是最常见的数字,出现
4次。
$heap = new MaxHeap();
foreach (array_count_values($numbers) as $n => $count)
$heap->insert([$n => $count]);
print_r($heap->top());
printf("%d is the most common number, appearing %d times",
key($heap->top()),
current($heap->top())
);
完整脚本
$numbers = [0, 1, 1, 1, 2, 3, 4, 4, 5, 6, 7, 7, 7, 7, 8, 8, 9];
class MaxHeap extends SplMaxHeap {
public function compare($a, $b) {
if (current($a) < current($b))
return -1;
elseif (current($a) > current($b))
return 1;
else
return 0;
}
}
$heap = new MaxHeap();
foreach (array_count_values($numbers) as $n => $count)
$heap->insert([$n => $count]);
printf("%d is the most common number, appearing %d times",
key($heap->top()),
current($heap->top())
);
修订历史
我之前不知道 PHP 自带的 array_count_values
函数。为了使用这个非常专业的函数,我把原先较为复杂的 array_reduce
函数删除了。感谢 @CBroe。