Php 对数组进行切片并保留顶部(x)个数字
假设我有三个不同的数组,例如Php 对数组进行切片并保留顶部(x)个数字,php,arrays,Php,Arrays,假设我有三个不同的数组,例如 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_arra
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)
此函数将为您提供所需的结果。它使用
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
)
我喜欢尼克的解决方案。也就是说,这是我以前的程序方法
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)。如果绩效是一个问题,那么有时候老派是值得考虑的。逻辑是什么?为什么在第二个切片数组中有5个元素?是的,这里的逻辑是什么?这些答案之一解决了你的问题吗?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑将最能解决你的问题的答案标记为(在上/下投票箭头下的复选标记)。请看,一个直接的foreach循环几乎总是比一个PHPs内置数组函数快,这主要是因为在循环中可以有一个数组函数不允许的
break
。对于这个问题,数组函数的真正优势在于可读性,我认为理解array\u filter
比理解foreach循环要容易得多。尽管如此,+1表示什么是好答案,并进行基准测试。。。