2011-02-10 67 views
0

我在格式2D阵列:PHP:在2D阵列最小值

[ 
[1, 23, 20], 
[2, 45, 30], 
[4, 63, 40], 
... 
] 

我试图搜索的阵列,并返回元素[0]和[1]从行,其中元素[1 ]最低。我有以下代码返回[1]中的最低值,但我不知道如何获取元素[0]。

$min = PHP_INT_MAX; 
foreach ($test as $i) { 
    $min = min($min, $i[1]); 
} 

在上面的例子中,我将返回[1,23]

感谢,

+0

,请注明如果PHP4或PHP5正在使用 – 2011-02-10 00:25:16

回答

1

您应该使用这个usort

usort($test, function($a, $b) { 
    return $a[1] - $b[1]; 
}); 

$min = $test[0]; 

注意,这里使用匿名函数,它们是在PHP 5.3中引入的。在以前的版本中,您需要使用命名函数并将名称作为字符串传递给usort

+0

优雅,但我不知道它更快。 – Hamish 2011-02-10 00:25:10

0

这将完成这项工作。

$min0 = PHP_INT_MAX; 
$min1 = PHP_INT_MAX; 
foreach ($test as $i) { 
    if($i[1] < $min1) 
    { 
     $min0 = $i[0]; 
     $min1 = $i[1]; 
    } 
} 

这将导致$ MIN0 == 1和$ MIN1 == 23

0

你需要介绍一些基本的逻辑:

$result = array(0, PHP_INT_MAX); 
foreach($test as $i) 
    if($i < $result[1]) 
     $result = array($i[0], $i[1]); 
1

你可以使用array_reduce

$array = array(
    array(1, 23, 20), 
    array(2, 45, 63), 
    array(4, 63, 40), 
); 
$callback = function ($a1, $a2) { 
    if ($a1[1] >= $a2[1]) { 
     return $a2; 
    } else { 
     return $a1; 
    } 
} 
$min = array_reduce($array, $callback, array(0, PHP_INT_MAX, 0)); 
var_dump($min); // array(1, 23, 20); 

现在,这可能会有问题,如果你有多个相同的元素[1]元素...但它透明地处理数组为空的情况。一般来说,您只需在回调函数中对所有“过滤”类型问题进行比较,您可以将过滤抽象为2个元素的比较。所以,你做字符串比较等,以确定哪两个是更好 ...

而且应该比一种更有效,因为它只需要在阵列上同一路径上(这是O(n)sortingO(n log n)在最坏的情况O(n^2))...

0

您可以使用一个简单的分(O(n))的圈像你这样,和array_slice分配前两个指标时,最低发现:

$min = PHP_INT_MAX; 
$arrMin = array(); 
foreach ($test as $i) { 
    if ($i[1] < $min) { 
     $min = $i[1]; 
     $arrMin = array_slice($i, 0, 2); 
    } 
} 
0

你应该抓住数组键最小数:

$min = PHP_INT_MAX; 
$minkey = 0; 
foreach ($test as $key => $i) { 
    if($min > $i[1]) { 
     $min = $i[1]; 
     $minkey = $key; 
    } 
} 

然后,你可以访问整个事情与$测试[$ minkey]一般