我有一个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]
谢谢,
答案 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)
而sorting为O(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]
访问整个事情