PHP:2D数组中的最小值

时间:2011-02-10 00:16:28

标签: php

我有一个2D数组格式:

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

我正在尝试搜索数组并从元素[1]最低的行返回元素[0]和[1]。我有以下代码返回[1]中的最低值,但我不知道如何获得元素[0]。

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

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

谢谢,

6 个答案:

答案 0 :(得分:1)

您应该使用usort

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

$min = $test[0];

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

答案 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个元素的比较。所以你进行字符串比较等来确定2中的哪一个更好 ......

它应该比排序更有效,因为它只需要在数组上进行一次传递(O(n)sortingO(n log n),最差O(n^2) )...

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

答案 3 :(得分:0)

您需要介绍一些基本逻辑:

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

答案 4 :(得分:0)

你可以像你一样使用简单的min(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);
    }
}

答案 5 :(得分:0)

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

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

然后,您可以使用$ test [$ minkey]

访问整个事情