在多维数组中找到最高值

Kar*_*arl 31 php max multidimensional-array

问题

我有一个类似于下面的多维数组.我想要实现的是一种从数组中查找和检索具有最高"Total"值的方法,现在我知道有一个被调用的函数,max但这不适用于像这样的多维数组.

我想做的是创建一个foreach循环并构建一个只包含总数的新数组,然后使用max查找最大值,这将起作用,唯一的问题是将检索与其相关的其余数据最大值.我不确定这是最有效的方式.

有任何想法吗?

Array
(
    [0] => Array
        (
            [Key1] => Key1
            [Total] => 13
        )

    [1] => Array
        (
            [Key2] => Key2
            [Total] => 117
        )

    [2] => Array
        (
            [Key3] => Key3
            [Total] => 39
        )
)
Run Code Online (Sandbox Code Playgroud)

Ast*_*rus 56

从PHP 5.5开始,您可以使用array_column获取特定键的值数组,并将其最大化.

max(array_column($array, 'Total'))


Bab*_*aba 26

只需做一个simple loop并比较值或使用array_reduce

$data = array_reduce($data, function ($a, $b) {
    return @$a['Total'] > $b['Total'] ? $a : $b ;
});

print_r($data);
Run Code Online (Sandbox Code Playgroud)

观看现场演示

  • 虽然使用`@`而不是检查一个值是否真的存在是不好的做法,但这是迄今为止最正确的答案.`array_reduce`适用于这类解决方案. (6认同)

Rob*_*ert 11

这是如此基本的算法.

$max = -9999999; //will hold max val
$found_item = null; //will hold item with max val;

foreach($arr as $k=>$v)
{
    if($v['Total']>$max)
    {
       $max = $v['Total'];
       $found_item = $v;
    }
}

echo "max value is $max";
print_r($found_item);
Run Code Online (Sandbox Code Playgroud)

工作演示

  • 您可以随时将其初始化为`$ max = null;`然后再添加一个条件来检查是否已设置`$ max`,如`if($ v ['Total']> $ max ||!$最大)`.在这种情况下,第一次运行循环并且没有定义`$ max`值时,它将设置一个.假设是,即使它是唯一的值,它在技术上也是最大值,无论你硬编码的任意最小值. (3认同)
  • 你为什么要用`-9999999`初始化`$max`? (2认同)

mis*_*tin 7

我知道这个问题已经过时了,但我提供了以下答案,以回应标记为重复后指出的另一个问题.这是我在目前的答案中没有提到的另一种选择.

我知道有一个名为max的函数,但这不适用于像这样的多维数组.

你可以解决这个问题,array_column这样可以很容易地获得最大值:

$arr = [['message_id' => 1,
             'points' => 3],
        ['message_id' => 2,
             'points' => 2],
        ['message_id' => 3,
             'points' => 2]];

// max value
$max = max(array_column($arr, 'points'));
Run Code Online (Sandbox Code Playgroud)

考虑到你可能真的想要多个键(如果$max匹配多个值),获取关联键是一个更棘手的地方.您可以array_map使用内部的匿名函数执行此操作,并使用array_filter以删除null值:

// keys of max value
$keys = array_filter(array_map(function ($arr) use ($max) {
    return $arr['points'] == $max ? $arr['message_id'] : null;
}, $arr));
Run Code Online (Sandbox Code Playgroud)

输出:

array(1) {
  [0]=>
  int(1)
}
Run Code Online (Sandbox Code Playgroud)

如果你最终得到多个键但只对找到的第一个匹配感兴趣,那么只需参考$keys[0].