代码之家  ›  专栏  ›  技术社区  ›  billyonecan

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

  •  6
  • billyonecan  · 技术社区  · 6 年前

    的文档 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 回复  |  直到 4 年前
        1
  •  2
  •   Matt Raines    6 年前

    根据 the documentation standard comparison rules .

    在“与各种类型的比较”表中指出,如果两个操作数都是数组,而操作数2中没有操作数1中的键,则数组是不可比较的。这就是为什么 min 只返回数组中的第一个值。

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

    • 依次对操作数1中的每个值与操作数2中具有相同键的值进行比较。
      • 否则,较小的数组就是值较小的数组。

    因为它们不可比, 最小 只是返回列表中的第一个数组。如果交换顺序,将返回另一个数组。如果使用 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]);
    
        2
  •  0
  •   David Lemon amitgoyal    6 年前

    只需将它们转换为简单数组,然后返回与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)
    }
    */