我在PHP中有一个带有重复数字的数组,我想找到最常见的数据,但只有当只有一个时才会找到它。
while (count(array_count_values($arr)) > 1) {
$minim = min(array_count_values($arr));
while ($minim == min(array_count_values($arr))) {
unset($arr[array_search(array_search(min(array_count_values($arr)), array_count_values($idList)), $arr)]);
$arr = array_splice($arr, 0, 1);
}
}
在我的代码中,第一个运行直到我在数组中只有一个数字(多次),而第二个运行时我删除了频率较低的数字。 我的问题是我的第二个 min()出现了这个错误:"数组必须包含至少一个元素"。
答案 0 :(得分:0)
您可以对计数执行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());
// [ 7 => 4 ]
printf("%d is the most common number, appearing %d times",
key($heap->top()),
current($heap->top())
);
// 7 is the most common number, appearing 4 times
完整脚本
$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。
答案 1 :(得分:0)
我在PHP中有一个带有重复数字的数组,我想找到最常见的数据,但只有当只有一个时才会找到它。
你的方法似乎相当复杂。
以下是我的表现:
$numbers = [1, 6, 5, 6, 2, 1, 6, 7, 8]; // positive test case
//$numbers = [1, 6, 5, 6, 2, 1, 6, 7, 8, 1]; // negative test case
$count = array_count_values($numbers); // get count of occurrence for each number
arsort($count); // sort by occurrence, descending
$first = key($count); // get key of first element, because that is the/one
// of the highest number(s)
$count_first = current($count); // get occurrence for first array value
$count_second = next($count); // get occurrence for second array value
if($count_first != $count_second) { // did they occur in different frequencies?
echo $first . ' occurred most in input array.';
}
else {
echo 'input array contained multiple values with highest occurrence.';
}