我正在使用以下代码从数组中检索最高的3个数字。
$a = array(1,2,5,10,15,20,10,15);
arsort($a, SORT_NUMERIC);
$highest = array_slice($a, 0, 3);
这段代码正确地给了我最高的三个数字array(20,15,10)
;但是,我有兴趣获得最高的3个数字,包括相同的数字。在这个例子中,我希望得到一个像array(10, 10, 15, 15, 20)
答案 0 :(得分:1)
可能更简单,但我的大脑已经累了。使用arsort()
获取最高优先级,计算值以获取带有计数的唯一键并切片前3个(确保通过true
以保留键):
arsort($a, SORT_NUMERIC);
$counts = array_slice(array_count_values($a), 0, 3, true);
然后循环那些3并用数值填充一个数组,计算它的次数并与之前的结果合并:
$highest = array();
foreach($counts as $value => $count) {
$highest = array_merge($highest, array_fill(0, $count, $value));
}
答案 1 :(得分:0)
您可以使用以下功能:
$a = array(1,2,5,10,15,20,10,15); //-- Original Array
function get3highest($a){
$h = array(); //-- highest
if(count($a) >= 3){ //-- Checking length
$c = 0; //-- Counter
while ($c < 3 || in_array($a[count($a)-1],$h) ){ //-- 3 elements or repeated value
$max = array_pop($a);
if(!in_array($max,$h)){
++$c;
}
$h[] = $max;
}
sort($h); //-- sorting
}
return $h; //-- values
}
print_r(get3Highest($a));
当然,您可以改进此功能,以接受最高&#34;最高等级的动态值。值。
答案 2 :(得分:0)
以下功能可能有用
$a = array(1,2,5,10,15,20,10,15);
function getMaxValue($array,$n){
$max_array = array(); // array to store all the max values
for($i=0;$i<$n;$i++){ // loop to get number of highest values
$keys = array_keys($array,max($array)); // get keys
if(is_array($keys)){ // if keys is array
foreach($keys as $v){ // loop array
$max_array[]=$array[$v]; // set values to max_array
unset($array[$v]); // unset the keys to get next max value
}
}else{ // if not array
$max_array[]=$array[$keys]; // set values to max_array
unset($array[$keys]); // unset the keys to get next max value
}
}
return $max_array;
}
$g = getMaxValue($a,3);
Out Put:
Array
(
[0] => 20
[1] => 15
[2] => 15
[3] => 10
[4] => 10
)
您可以修改它以添加条件。
答案 3 :(得分:0)
我想到了其他几种可能性。
第一个:
找出前三个值中的最低值
$min = array_slice(array_unique($a, SORT_NUMERIC), -3)[0];
过滤掉任何较低的值
$top3 = array_filter($a, function($x) use ($min) { return $x >= $min; });
对结果进行排序
sort($top3);
优点:代码更少 缺点:效率较低(排序,迭代整个数组,对结果进行排序)
第二个:
按相反顺序对数组进行排序
rsort($a);
迭代数组,将项目附加到结果数组中,直到您添加了三个不同的项目。
$n = 0;
$prev = null;
$top = [];
foreach ($a as $x) {
if ($x != $prev) $n++;
if ($n > 3) break;
$top[] = $x;
$prev = $x;
}
优点:效率更高(仅排序一次,只根据需要进行迭代)
缺点:更多代码
这会以降序显示结果。您可以选择使用array_unshift($top, $x)
代替$top[] = $x;
来按升序排列,但我想我已经读过array_unshift
效率较低,因为它在每次添加后重新索引数组,因此,如果优化很重要,那么最好只使用$top[] = $x;
然后以相反的顺序迭代结果。