Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对数组进行切片并保留顶部(x)个数字_Php_Arrays - Fatal编程技术网

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表示什么是好答案,并进行基准测试。。。