Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:二维数组中的最小值_Php - Fatal编程技术网

PHP:二维数组中的最小值

PHP:二维数组中的最小值,php,Php,我有一个二维数组,格式如下: [ [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] 谢谢,您应该为此使用: usort($test, funct

我有一个二维数组,格式如下:

[
[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]

谢谢,

您应该为此使用:

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

$min = $test[0];
请注意,这使用了PHP5.3中引入的匿名函数。在以前的版本中,您需要使用命名函数,并将名称作为字符串传递给
usort

这将完成此任务

$min0 = PHP_INT_MAX;
$min1 = PHP_INT_MAX;
foreach ($test as $i) {
    if($i[1] < $min1)
    {
        $min0 = $i[0];
        $min1 = $i[1];
    }
}
$min0=PHP\u INT\u MAX;
$min1=PHP\u INT\u MAX;
foreach($i测试){
如果($i[1]<$min1)
{
$min0=$i[0];
$min1=$i[1];
}
}

这将导致$min0==1和$min1==23,您需要介绍一些基本逻辑:

$result = array(0, PHP_INT_MAX);
foreach($test as $i)
   if($i < $result[1])
      $result = array($i[0], $i[1]);
$result=array(0,PHP\u INT\u MAX);
foreach($i测试)
如果($i<$result[1])
$result=数组($i[0],$i[1]);
您可以使用:

现在,如果有多个元素具有相同的
[1]
元素,则可能会出现问题。。。但它透明地处理数组为空的情况。通常,您需要做的就是在回调函数中对所有“筛选”类型的问题进行比较,您可以将筛选抽象为两个元素的比较。所以,您需要进行字符串比较等,以确定2中哪一个更好

而且它应该比排序更有效,因为它只需要对数组进行单次遍历(它是
O(n)
,而它是
O(n log n)
,最坏的情况是
O(n^2)
)…

您可以像以前一样使用一个简单的min(O(n))循环,并在找到最低值时分配前两个索引:

$min = PHP_INT_MAX;
$arrMin = array();
foreach ($test as $i) {
    if ($i[1] < $min) {
       $min = $i[1];
       $arrMin = array_slice($i, 0, 2);
    }
}
$min=PHP\u INT\u MAX;
$arrMin=array();
foreach($i测试){
如果($i[1]<$min){
$min=$i[1];
$arrMin=array\u片($i,0,2);
}
}

您只需抓取最小数字的数组键:

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

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

访问整个内容。一般来说,请说明是否正在使用php4或php5。谁在乎?它应该仍然需要线性时间。@erisco@lonesomeday:PHP中的排序使用快速排序,它是
O(n^2)
,它不是线性的。。。因此,一个简单的循环/reduce调用所需的操作数是
n
的两倍。对于小型阵列而言,这不是一个问题,但对于大型阵列而言,这可能是一个巨大的问题(特别是由于回调).@ircmaxell quicksort是O(nlogn)平均值,可能更快或等于线性时间。最坏的情况是o(n^2)。啊,我刚刚意识到这是一种。好的,同样的评论,但是“应该仍然需要nlogn时间!”@Casey:如果我错了,请纠正我,但是既然您仍然需要访问每个节点至少一次,那么排序怎么可能花费少于
O(n)
的时间(否则它是如何进行排序的)。因此,对于
n
(小于10)的小值,虽然
O(n log n)
将比
O(n)
快,但快速排序不会,因为它仍然需要访问每个
n
至少一次。。。
$min = PHP_INT_MAX;
$minkey = 0;
foreach ($test as $key => $i) {
    if($min > $i[1]) {
        $min = $i[1];
        $minkey = $key;
    }
}