我有一个 PHP 数组,其中包含一堆 unix 时间戳。
作为一个简化的示例,这是一个包含 10 个值的数组。
$array = [
1510790277,
1586522582,
1572272336,
1650049585,
1591332330,
1698088238,
1646561226,
1639050043,
1652067570,
1548161804,
];
我需要生成一个数组,其中包含该数组中 3 个最大数字的索引。
从示例数组中,我期望得到
[5, 8, 3]
的结果 - 按此顺序。
您可以使用 asort 对数组进行排序并维护索引,然后使用 slice 和第四个参数,再次维护索引,捕获您要查找的前 x 个元素,最后使用 array_keys .
很可能有一种更快的方法,但这只是为了表明有大量的 PHP 数组函数可以帮助您实现您正在寻找的效果。
Simon 发布了简单且可能足够好的执行方法。
另一种选择(仅当您有一个非常大的数组时)是扫描数组并跟踪您看到的三个最高值的索引。这是 O(n),但是(特别是因为它是解释的 PHP 代码,而不是编译的内置函数),除了最大的数组之外,对于所有数组来说可能都比较慢。
伪代码:
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);
要隔离数组中三个最新 unix 时间戳的键,请执行以下操作:
代码:(演示)
arsort($array);
var_export(
array_keys(
array_slice($array, 0, 3, true)
)
);
在 PHP 代码中:
function threeLargest($array){
krsort($array, "SORT_NUMERIC");
$return[0] = $array[0];
$return[1] = $array[1];
$return[2] = $array[2];
return $return;
}