说我有三个不同的数组,例如。
array1 = (A=7,B=5,C=5,D=4,E=3,F=3,G=2)
array2 = (A=7,B=7,C=5,D=5,E=5,F=3,G=2)
array1 = (A=7,B=7,C=7,D=7,E=3,F=3,G=2)
我正在寻找一种方法,可以对每个数组进行切片,以便使顶部数达到3个数字,例如
sliced_array1 = (A=7,B=5,C=5)
sliced_array2 = (A=7,B=7,C=5,D=5,E=5)
sliced_array3 = (A=7,B=7,C=7,D=7)
我尝试过
sliced_array=array_slice($array, 0, 3, true);
但最终结果如下所示
sliced_array1 = (A=7,B=5,C=5)
sliced_array2 = (A=7,B=7,C=5)
sliced_array3 = (A=7,B=7,C=7)
答案 0 :(得分:1)
我喜欢尼克的解决方案。就是说,这是我以前的程序方法。
function array_top($array,$target=3) {
arsort($array);
$result=[];
$previous=NULL;
foreach ($array as $index=>$value) {
if ((count($result)>=$target) and ($value!=$previous)) break;
$result[$index]=$value;
$previous=$value;
}
return $result;
}
$array1=['A'=>7,'B'=>5,'C'=>5,'D'=>4,'E'=>3,'F'=>3,'G'=>2];
$array2=['A'=>7,'B'=>7,'C'=>5,'D'=>5,'E'=>5,'F'=>3,'G'=>2];
$array3=['A'=>7,'B'=>7,'C'=>7,'D'=>7,'E'=>3,'F'=>3,'G'=>2];
print_r(array_top($array1));
print_r(array_top($array2));
print_r(array_top($array3));
有趣的是,我将此功能的性能与Nick的解决方案进行了比较,在相同的三个示例中对其进行了100k次迭代,并且速度更快(0.59s vs 0.98s)。如果性能是一个问题,那么有时候值得考虑一下老派。
答案 1 :(得分:0)
此功能将为您提供所需的结果。它使用arsort
对数组进行排序(保留键),然后找到第三个(可能相等)的最高值,并返回数组中所有大于或等于该值的值:
function top_3($array) {
// reverse sort the array, retaining keys
arsort($array);
// get the third highest value
$min = array_values($array)[2];
return array_filter($array, function ($v) use ($min) { return $v >= $min; });
}
print_r(top_3($array1));
print_r(top_3($array2));
print_r(top_3($array3));
输出:
Array
(
[A] => 7
[B] => 5
[C] => 5
)
Array
(
[A] => 7
[B] => 7
[C] => 5
[D] => 5
[E] => 5
)
Array
(
[A] => 7
[B] => 7
[C] => 7
[D] => 7
)