获取平面数组中 3 个最大值的索引

问题描述 投票:0回答:5

我有一个 PHP 数组,其中包含一堆 unix 时间戳。

作为一个简化的示例,这是一个包含 10 个值的数组。

$array = [
  1510790277,
  1586522582,
  1572272336,
  1650049585,
  1591332330,
  1698088238,
  1646561226,
  1639050043,
  1652067570,
  1548161804,
];

我需要生成一个数组,其中包含该数组中 3 个最大数字的索引。

从示例数组中,我期望得到

[5, 8, 3]
的结果 - 按此顺序。

php arrays sorting key slice
5个回答
7
投票

您可以使用 asort 对数组进行排序并维护索引,然后使用 slice 和第四个参数,再次维护索引,捕获您要查找的前 x 个元素,最后使用 array_keys .

很可能有一种更快的方法,但这只是为了表明有大量的 PHP 数组函数可以帮助您实现您正在寻找的效果。


1
投票

Simon 发布了简单且可能足够好的执行方法。

另一种选择(仅当您有一个非常大的数组时)是扫描数组并跟踪您看到的三个最高值的索引。这是 O(n),但是(特别是因为它是解释的 PHP 代码,而不是编译的内置函数),除了最大的数组之外,对于所有数组来说可能都比较慢。


0
投票

伪代码:

function select(list[1..n], k)
     for i from 1 to k
         maxIndex = i
         maxValue = list[i]
         for j from i+1 to n
             if list[j] > maxValue
                 maxIndex = j
                 maxValue = list[j]
         swap list[i] and list[maxIndex]
     return list[k]

newarray[] = select(array, 1);
newarray[] = select(array, 2);
newarray[] = select(array, 3);

0
投票

要隔离数组中三个最新 unix 时间戳的键,请执行以下操作:

  1. 将整数数组按降序排序,同时保留原始键,然后
  2. 截断前 3 个元素之后的所有元素,同时保留原始键,然后
  3. 访问缩减数组的键。

代码:(演示

arsort($array);
var_export(
    array_keys(
        array_slice($array, 0, 3, true)
    )
);

-1
投票

在 PHP 代码中:

function threeLargest($array){
 krsort($array, "SORT_NUMERIC");
 $return[0] = $array[0];
 $return[1] = $array[1];
 $return[2] = $array[2];
 return $return;
}
© www.soinside.com 2019 - 2024. All rights reserved.