Я сделал массив на PHP, который содержит множество временных меток unix.
Я пытаюсь создать функцию, которая вернет массив, содержащий индексы трех наибольших чисел в этом массиве.
Например, если самые большие числа находятся в индексах 3,5 и 8
И если наибольшее значение равно 5, второе наибольшее - 8, а наименьшее из трех - число 3, мне нужен массив, содержащий значения (5,8,3) в этом порядке.
И, честно говоря, я понятия не имею, как это осуществить. Кто-нибудь знает, как это сделать?






Саймон опубликовал простой и, вероятно, достаточно эффективный метод.
Другой вариант, только если у вас действительно большой массив, - это сканирование массива и отслеживание индексов трех высших значений, которые вы видите. Это O (n), но (особенно потому, что это интерпретируемый PHP-код, а не скомпилированная встроенная функция), вероятно, медленнее для всех массивов, кроме самого большого.
Вы можете использовать asort для сортировки массива и поддержки индекса, а затем использовать ломтик вместе с 4-м параметром, опять же, чтобы поддерживать индекс, чтобы определить максимальное количество x элементов, которые вы ищете, и, наконец, использовать array_keys.
Возможно, есть более быстрый способ, но он просто для того, чтобы показать, что существует множество функций массива PHP, которые помогут вам достичь желаемого эффекта.
Ах, рад, что помог. В качестве альтернативы вы могли бы использовать array_slice, чтобы разрезать другой конец массива, но на самом деле это та же разница.
В псевдокоде:
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);
В коде PHP:
function threeLargest($array){
krsort($array, "SORT_NUMERIC");
$return[0] = $array[0];
$return[1] = $array[1];
$return[2] = $array[2];
return $return;
}
это не сработало. По какой-то причине в моем отладчике не работают функции сортировки массивов ...
Спасибо, это решило мою проблему с одним небольшим исключением. Функция, которая дала мне 3 наибольших значения в качестве первых 3 чисел в новом массиве, должна быть arsort, а не asort