stackoverflow から。
php - Getting $n number of maximum values - Stack Overflow
Hello all,
Straight to the question -
If $n = 3,
and input is -
Array
(
[04] => 3
[07] => 4
[01] => 5
[06] => 5
[05] => 5
[03] => 6
[08] => 6
[02] => 7
[09] => 8
[12] => 9
[10] => 10
[15] => 10
[19] => 11
[20] => 11
[13] => 12
[21] => 12
[16] => 13
[14] => 14
[22] => 14
[23] => 15
[11] => 15
[00] => 15
[17] => 17
[18] => 17
)
Output should be -
Array
( [14] => 14
[22] => 14
[23] => 15
[11] => 15
[00] => 15
[17] => 17
[18] => 17
)
Thank you, all, for help.
これに対する回答は以下の通り。
Would've been nice if you explained the output a bit. I guess what you want is to have an
array that only contains items with the n different biggest values (14,15,17 for this input).
– schnaader
Yes, that's exactly what I want. – KPL
@KPL: Can you look at my answer once more – Shakti Singh
arsort($array);
function output($array,$n)
{
$c=0;
$newArray=array();
foreach ($array as $key => $value)
{
if ($c == $n)
{
$newArray[$key]=$value;
return $newArray;
}
if (!in_array($value, $newArray))
{
$c++;
}
$newArray[$key]=$value;
}
}
+1 for good logic , want to develope better logics – Rahul Mehta
For the above input, the function outputs Array ( [17] => 17 [18] => 17 [23] => 15 [00] => 15 [11] => 15 [14] => 14 )
The [22] => 14 is missing. – KPL 37
No change at all. :| – KPL
@KPL:- Now, This is what you are looking for – Shakti Singh
A quick hack into Shakti's function. But, is this reliable?
function getMaxValues( $array, $total ) {
arsort( $array );
$count = 0;
$return = array();
$total++;
foreach ($array as $key => $value) {
if ( !in_array( $value, $return ) )
$count++;
$return[ $key ] = $value;
if ( $count == $total ) {
array_pop($return);
return $return;
}
}
}
Something like:
function biggest_n(array $a, $n)
{
$u = array_unique($a);
if (count($u) <= $n) return $a;
rsort($u);
$val = $u[$n - 1];
return array_filter($a, function($e) use($val) { return $e >= $val; });
}
Ruby でやってみました。
効率とかスピードは一切考えてません :)
irb(main):063:0> x = {
irb(main):064:1* "[04]" => 3,
irb(main):065:1* "[07]" => 4,
irb(main):066:1* "[01]" => 5,
irb(main):067:1* "[06]" => 5,
irb(main):068:1* "[05]" => 5,
irb(main):069:1* "[03]" => 6,
irb(main):070:1* "[08]" => 6,
irb(main):071:1* "[02]" => 7,
irb(main):072:1* "[09]" => 8,
irb(main):073:1* "[12]" => 9,
irb(main):074:1* "[10]" => 10,
irb(main):075:1* "[15]" => 10,
irb(main):076:1* "[19]" => 11,
irb(main):077:1* "[20]" => 11,
irb(main):078:1* "[13]" => 12,
irb(main):079:1* "[21]" => 12,
irb(main):080:1* "[16]" => 13,
irb(main):081:1* "[14]" => 14,
irb(main):082:1* "[22]" => 14,
irb(main):083:1* "[23]" => 15,
irb(main):084:1* "[11]" => 15,
irb(main):085:1* "[00]" => 15,
irb(main):086:1* "[17]" => 17,
irb(main):087:1* "[18]" => 17
irb(main):088:1> }
=> {"[04]"=>3, "[07]"=>4, "[01]"=>5, "[06]"=>5, "[05]"=>5, "[03]"=>6, "[08]"=>6,
"[02]"=>7, "[09]"=>8, "[12]"=>9, "[10]"=>10, "[15]"=>10, "[19]"=>11, "[20]"=>11,
"[13]"=>12, "[21]"=>12, "[16]"=>13, "[14]"=>14, "[22]"=>14, "[23]"=>15, "[11]"=>15,
"[00]"=>15, "[17]"=>17, "[18]"=>17}
irb(main):095:0> x.group_by{|e| e[1]}
=> {3=>[["[04]", 3]], 4=>[["[07]", 4]], 5=>[["[01]", 5], ["[06]", 5], ["[05]", 5]],
6=>[["[03]", 6], ["[08]", 6]], 7=>[["[02]", 7]], 8=>[["[09]", 8]], 9=>[["[12]", 9]],
10=>[["[10]", 10], ["[15]", 10]], 11=>[["[19]", 11], ["[20]", 11]], 12=>[["[13]", 12],
["[21]", 12]], 13=>[["[16]", 13]], 14=>[["[14]", 14], ["[22]", 14]], 15=>[["[23]", 15],
["[11]", 15], ["[00]", 15]], 17=>[["[17]", 17], ["[18]", 17]]}
irb(main):103:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}
=> [[3, [["[04]", 3]]], [4, [["[07]", 4]]], [5, [["[01]", 5], ["[06]", 5], ["[05]", 5]]],
[6, [["[03]", 6], ["[08]", 6]]], [7, [["[02]", 7]]], [8, [["[09]", 8]]], [9, [["[12]", 9]]],
[10, [["[10]", 10], ["[15]", 10]]], [11, [["[19]", 11], ["[20]", 11]]], [12, [["[13]", 12],
["[21]", 12]]], [13, [["[16]", 13]]], [14, [["[14]", 14], ["[22]", 14]]], [15, [["[23]", 15],
["[11]", 15], ["[00]", 15]]], [17, [["[17]", 17], ["[18]", 17]]]]
irb(main):104:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}[0..2]
=> [[3, [["[04]", 3]]], [4, [["[07]", 4]]], [5, [["[01]", 5], ["[06]", 5], ["[05]", 5]]]]
irb(main):105:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}[0..2].map{|e| e[1]}
=> [[["[04]", 3]], [["[07]", 4]], [["[01]", 5], ["[06]", 5], ["[05]", 5]]]
irb(main):109:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}.reverse[0..2]
=> [[17, [["[17]", 17], ["[18]", 17]]], [15, [["[23]", 15], ["[11]", 15], ["[00]", 15]]],
[14, [["[14]", 14], ["[22]", 14]]]]
irb(main):110:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}.reverse[0..2].map{|e| e[1]}
=> [[["[17]", 17], ["[18]", 17]], [["[23]", 15], ["[11]", 15], ["[00]", 15]], [["[14]", 14], ["[22]", 14]]]
irb(main):111:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}.reverse[0..2].map{|e| e[1]}.reverse
=> [[["[14]", 14], ["[22]", 14]], [["[23]", 15], ["[11]", 15], ["[00]", 15]], [["[17]", 17], ["[18]", 17]]]
irb(main):112:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}.reverse[0..2].map{|e| e[1]}.reverse.flatten
=> ["[14]", 14, "[22]", 14, "[23]", 15, "[11]", 15, "[00]", 15, "[17]", 17, "[18]", 17]
irb(main):113:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}.reverse[0..2].map{|e| e[1]}.reverse.flatten(1)
=> [["[14]", 14], ["[22]", 14], ["[23]", 15], ["[11]", 15], ["[00]", 15], ["[17]", 17], ["[18]", 17]]