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]
为什么?
答案 0 :(得分:2)
根据the documentation的值使用standard comparison rules进行比较。
在“各种类型比较”表中,该表指出,如果两个操作数都是数组,并且操作数1中的键不存在于操作数2中,则这些数组不可比较。这就是min
仅返回数组中第一个值的原因。
具体来说,数组比较如下:
由于它们不具有可比性,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)
}
*/