从包含相同值的数组中获取x最高值

时间:2017-04-27 18:30:05

标签: php arrays

我正在使用以下代码从数组中检索最高的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)

这样的数组

4 个答案:

答案 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)

我想到了其他几种可能性。

第一个:

  1. 找出前三个值中的最低值

    $min = array_slice(array_unique($a, SORT_NUMERIC), -3)[0];
    
  2. 过滤掉任何较低的值

    $top3 = array_filter($a, function($x) use ($min) { return $x >= $min; });
    
  3. 对结果进行排序

    sort($top3);
    
  4. 优点:代码更少 缺点:效率较低(排序,迭代整个数组,对结果进行排序)

    第二个:

    1. 按相反顺序对数组进行排序

      rsort($a);
      
    2. 迭代数组,将项目附加到结果数组中,直到您添加了三个不同的项目。

      $n = 0;
      $prev = null;
      $top = [];
      
      foreach ($a as $x) {
          if ($x != $prev) $n++;
          if ($n > 3) break;
          $top[] = $x;
          $prev = $x;
      }
      
    3. 优点:效率更高(仅排序一次,只根据需要进行迭代)
      缺点:更多代码

      这会以降序显示结果。您可以选择使用array_unshift($top, $x)代替$top[] = $x;来按升序排列,但我想我已经读过array_unshift效率较低,因为它在每次添加后重新索引数组,因此,如果优化很重要,那么最好只使用$top[] = $x;然后以相反的顺序迭代结果。