2008-10-31 2 views
1

Кто-нибудь знает, как я могу получить два самых больших значения из третьего столбца в следующем массиве?Наибольшие значения в массиве

$ar = array(array(1, 1, 7.50, 'Hello'), 
       array(1, 2, 18.90, 'Hello'), 
       array(3, 5, 11.50, 'Hello'), 
       array(2, 4, 15.90, 'Hello')); 

Вывод должен быть:

15.90 
18.90 

Заранее спасибо

ответ

3

Если вы уверены, что значение (два) никогда не изменится, просто перебрать массив и следить из два самых больших числа. Если нет, сортируйте массивы с помощью usort() и обеспечив соответствующий обратный вызов. Затем возьмите первые два значения:

function cmp($a, $b) { 
    $a = $a[2]; 
    $b = $b[2]; 
    return $a == $b ? 0 : $a < $b ? 1 : -1; 
} 

usort($ar, 'cmp'); 
0

Один из самых простых способов сделать это, чтобы собрать все значения в один массив, отсортировать массив, а затем распечатать первые два значения.

Есть более эффективные способы, которые не включают сортировку всего массива, но выше вы должны начать.

3

Сортировка O (n log n), но вы можете это сделать в O (n) (то есть быстрее, если массив большой). ПСЕВДОКОД следующим образом: более общее решение

first = array[0][2] 
second = array[1][2] 
if second > first 
    first, second = second, first 
for tuple in array[2:n] 
    if tuple[2] > second 
     second = tuple[2] 
    if second > first 
     first, second = second, first 
+0

Любопытно, как мы можем писать код Python, опустить какой-то двоеточие и называть его псевдокодом. Не так ли?: ^) –

3

А, для п больших значений (псевдо-код)

def maxN(list, n): 
    result = [] 
    curmin = 0 
    for number in list: 
     if number > curmin: 
      binary insert number into result. #O(log n) 
      if len(result) > n: 
       truncate last element   #O(1) 
      curmin = new minimum in result list #O(1) since list is sorted 

    return result 

Все это займет ... O (т лог п), где т размер списка и n - количество максимальных элементов, которые вы хотите. Это намного лучше, чем если вы сортируете список, который принимает O (n log n), для больших n.

Но это также слишком много, если вы просто хотите получить максимум два элемента.

0

Откуда вы получаете данные массива? Как часто будут меняться данные? Можете ли вы получить массив, отсортированный по этому полю? Если имеется большое количество элементов данных, может быть стоит сделать второй запрос?

Смежные вопросы