数组上最大的值

时间:2008-10-31 20:47:38

标签: php arrays

有谁知道如何从以下阵列的第三列获得两个最大的最大值?

$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

提前致谢

5 个答案:

答案 0 :(得分:3)

如果您确定值(2)永远不会改变,只需遍历数组并跟踪两个最大的数字。如果没有,请使用usort()对数组进行排序并提供适当的回调。然后取前两个值:

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

usort($ar, 'cmp');

答案 1 :(得分: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

答案 2 :(得分:3)

更通用的解决方案,对于n个最大值(伪代码)

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(m log n),其中m是列表的大小,n是所需的最大元素数。这比对列表进行排序要好得多,对于大n,这需要O(n log n)。

但是,如果你只想要最多两个元素,这也是过度的。

答案 3 :(得分:0)

最简单的方法之一是将所有值收集到一个数组中,对数组进行排序,然后打印出前两个值。

有一些更有效的方法不涉及整个数组的排序,但上面的内容应该让你开始。

答案 4 :(得分:0)

从哪里获取阵列数据? 数据多久会改变一次? 你能得到已按该字段排序的数组吗? 如果有大量数据项,是否值得进行第二次查询?