【问题标题】:Finding the minimum value's key in an associative array在关联数组中查找最小值的键
【发布时间】:2010-12-07 23:36:48
【问题描述】:

在 PHP 中,假设您有一个这样的关联数组:

$pets = array(
    "cats" => 1,
    "dogs" => 2,
    "fish" => 3
);

如何找到具有最低值的键?在这里,我将寻找cats。

是否有一些我错过的内置 PHP 函数可以做到这一点?如果有一个解决方案可以解决多个值相同的问题,那就太好了,如下所示:

$pets = array(
    "cats" => 1,
    "dogs" => 1,
    "fish" => 2
);

上面,我不介意它是否只是输出; cats 或 dogs。

提前致谢。

【问题讨论】:

    标签: php associative-array


    【解决方案1】:

    另一种检索单个字符串的方法是使用desirable sorting method 并通过在排序后的数组上使用key() 直接检索第一个键。在这种情况下,需要具有最低值的键,asort 将从最低值到最高值排序并重置内部指针。要检索反向(从最高到最低),请使用arsort。

    示例:https://3v4l.org/5ijPh

    $pets = array(
       "dogs" => 2,
       "cats" => 1,
       "fish" => 3
    );
    asort($pets);
    var_dump(key($pets));
    //string(4) "cats"
    
    $pets = array(
       "dogs" => 1,
       "cats" => 1,
       "fish" => 3
    );
    asort($pets);
    var_dump(key($pets));
    //string(4) "dogs"
    

    请注意,所有 PHP 数组排序方法都会通过引用改变数组。 为防止更改原始数组,请创建数组的副本或使用Iterator。

    $petsSorted = $pets;
    asort($petsSorted);
    key($petsSorted);
    

    【讨论】:

      【解决方案2】:

      我就是这样做的。

      $pets = array(
          "cats" => 1,
          "dogs" => 2,
          "fish" => 3
      );
      
      array_search(min($pets), $pets); 
      

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        找到最高值

        print max(120, 7, 8, 50);
        

        返回 --> 120

        $array = array(100, 7, 8, 50, 155, 78);
        print max($array);
        

        返回 --> 155

        找出最小值

        print min(120, 7, 8, 50);
        

        返回 --> 7

        $array = array(50, 7, 8, 101, 5, 78);
        print min($array);
        

        返回 --> 5

        【讨论】:

        • 问题在于找到关键,而不仅仅是价值。
        【解决方案4】:
        $min_val = null;
        $min_key = null;
        foreach($pets as $pet => $val) {
          if ($val < $min_val) {
            $min_val = $min;
            $min_key = $key;
          }
        }
        

        还可以翻转数组,按键排序:

        $flipped = array_flip($pets);
        ksort($flipped);
        

        那么第一个key是最小值,它的值就是原数组中的key。

        【讨论】:

        • 您忘记关闭括号。并且按照 SilentGhost 的建议使用 array_keys 和 min 会更容易和更快。
        【解决方案5】:

        可能会尝试调查这些:

        【讨论】:

        【解决方案6】:

        array_keys是你的朋友:

        $pets = array(
            "cats" => 1,
            "dogs" => 2,
            "fish" => 3
        );
        array_keys($pets, min($pets));  # array('cats')
        

        P.S.:在 SO 的某个地方有一个 dup(它有 max 而不是 min,但我清楚地记得它)。

        【讨论】:

        • 这很聪明 =) 也许你应该提到它返回一个包含 1 个或多个值的列表(除非数组为空。)
        • min(array_keys($pets, min($pets)); 将确保您得到一个单一的答案,而不是一个数组。这可能会让那些简单地复制和粘贴此方法的人感到困惑。
        • @Augie Gardner current(array_keys($pets, min($pets)); - 快一点
        • 上面的代码很优雅但不是最优的。它涉及几个操作(查找 N 个元素的最小值,查找 N 个键,查找具有子集 N 中的值的键)。更快的版本是搜索算法。不过,我从未为此做过基准测试。
        猜你喜欢
        • 2012-11-03
        • 2016-06-07
        • 1970-01-01
        • 2014-11-27
        • 1970-01-01
        • 2018-05-16
        • 1970-01-01
        • 2017-10-21
        • 1970-01-01
        相关资源
        最近更新 更多