使用min()获取包含最小值的数组

时间:2018-10-04 15:01:20

标签: php arrays

min()的文档显示以下示例:

// Multiple arrays of the same length are compared from left to right
// so in our example: 2 == 2, but 4 < 5
$val = min(array(2, 4, 8), array(2, 5, 1)); // array(2, 4, 8)

给出以下代码:

$input = [
    [3, 6],
    [2, 9],
];

var_dump(min(...$input)); // returns [2, 9] as expected

如果将相同的数组关联,则失败,并且似乎总是返回第一个数组:

$input = [
    ["three" => 3, "six"  => 6],
    ["two"   => 2, "nine" => 9],
];

var_dump(min(...$input)); // returns ["three" => 3, "six" => 6]

为什么?

Here's an example

2 个答案:

答案 0 :(得分:2)

根据the documentation的值使用standard comparison rules进行比较。

在“各种类型比较”表中,该表指出,如果两个操作数都是数组,并且操作数1中的键不存在于操作数2中,则这些数组不可比较。这就是min仅返回数组中第一个值的原因。

具体来说,数组比较如下:

  • 如果一个数组的值比另一个数组少,则它会更小。
  • 否则,如果操作数1中的任何键不在操作数2中,则数组不可比。
  • 依次对操作数1中的每个值,与操作数2中具有相同键的值进行比较。
    • 如果相同,则继续比较值。
    • 否则,较小的数组就是值较小的数组。

由于它们不具有可比性,min只是返回列表中的第一个数组。如果交换订单,将返回另一个数组。如果使用sort($input)对数组进行排序,则会看到此信息。每次对数组排序时,数组都将反转。

要获得所需的行为,请根据数组的值对数组进行排序,然后获取第一个元素。但是请注意,这将取决于您首先定义的键,因此["three" => 3, "six" => 6]["six" => 6, "three" => 3] 不相同。

usort($input, function($a, $b) { return array_values($a) <=> array_values($b); });
var_dump($input[0]);

答案 1 :(得分:0)

只需将它们转换为简单数组,然后返回与min结果关联的关联数组。

<?php

function array_min_assoc(){
  $args = func_get_args();
  $not_assoc = array_map('array_values',$args);
  $min = min(...$not_assoc);

  $key = array_search($min, $not_assoc);
  if ($key !== false){
    return $args[$key];
  }

}

$input = [
    ["three" => 3, "six"  => 6],
    ["two"   => 2, "nine" => 9],
];

var_dump(array_min_assoc(...$input)); 
/* returns
array(2) {
  ["two"] => int(2)
  ["nine"]=> int(9)
}
*/