有谁知道如何从以下阵列的第三列获得两个最大的最大值?
$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
提前致谢
答案 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)
从哪里获取阵列数据? 数据多久会改变一次? 你能得到已按该字段排序的数组吗? 如果有大量数据项,是否值得进行第二次查询?