获取数组中的最小值并包含重复项

时间:2019-05-16 07:18:34

标签: php arrays

说你有这个数组:

$users = [
    'a' => 2,
    'b' => 1,
    'c' => 1,
    'd' => 3
];

我需要获取具有最低值的键。因此,在这种情况下,它们将是bc

目前正在这样做:

asort($users);

$lowestValue = array_values($users)[0];

foreach ($users as $k => $v)
    if ($v == $lowestValue)
        $lowestUsers[$k] = $v;

print_r($lowestUsers);

这很好用,但是有更短/更有效的方法吗?

5 个答案:

答案 0 :(得分:6)

您可以使用array_keys查找数组中值最低的键。如果您将array_keys的值作为第二个参数传递,它将返回一个数组,其中包含在该数组中具有该值的所有键。请注意,仅使用min可能是获得最小值的最简单方法:

$lowestValue = min($users);
print_r(array_keys($users, $lowestValue));

输出:

Array (
  [0] => b
  [1] => c 
)

Demo on 3v4l.org

如果您实际上希望$users数组的元素具有最低的值,则可以获取array_keys的输出并通过array_intersect_key运行它:

$lowestValue = min($users);
$lowestValueKeys = array_keys($users, $lowestValue);
$lowestUsers = array_intersect_key($users, array_flip($lowestValueKeys));
print_r($lowestUsers);

尽管是这种情况,只是使用array_filter会更简单:

$lowestValue = min($users);
$lowestUsers = array_filter($users, function ($v) use ($lowestValue) { return $v === $lowestValue; });
print_r($lowestUsers);

两种情况下的输出均为

Array (
  [b] => 1
  [c] => 1 
)

Demo on 3v4l.org

答案 1 :(得分:3)

您可以结合使用array_keysmin来做到这一点。无需排序或循环,

print_r(array_keys($users, min($users)));

输出

Array
(
    [0] => b
    [1] => c
)

工作demo

答案 2 :(得分:2)

这对你有帮助。

$users = [
    'a' => 2,
    'b' => 1,
    'c' => 1,
    'd' => 3
];

echo array_search(min($users ), $users );

答案 3 :(得分:1)

您可以使用min()函数来查找数组中的最小值,并可以使用array_filter()函数来过滤数据。例如:

$users = [
    'a' => 2,
    'b' => 1,
    'c' => 1,
    'd' => 3
];

$lowest = min($users);

$result = array_filter($users, function($value, $key) use ($lowest) {
    return $value === $lowest;
}, ARRAY_FILTER_USE_BOTH);

结果:

  

数组(       [b] => 1       [c] => 1)

答案 4 :(得分:0)

您有更多选择:

  1. 使用 min()获得最小值,并使用array_keys($users, $minvalue)获得相关密钥(包括重复项)
  2. 使用asort($users)对数组进行排序,并使用$users[0]获得最小值(不显示重复项)