切片数组并保留前(x)个数字

时间:2019-10-02 07:01:23

标签: 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_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)

2 个答案:

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

Demo on 3v4l.org