在多维数组中找到最高值

时间:2013-06-27 09:25:11

标签: php multidimensional-array max

问题

我有一个类似于下面的多维数组。我想要实现的是一种从数组中查找和检索具有最高“Total”值的方法,现在我知道有一个名为max的函数,但是它不适用于多维数组,如此

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

有什么想法吗?

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

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

    [2] => Array
        (
            [Key3] => Key3
            [Total] => 39
        )
)

9 个答案:

答案 0 :(得分:42)

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

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

答案 1 :(得分:23)

只需执行simple loop并比较值或使用array_reduce

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

print_r($data);

See Live Demo

答案 2 :(得分:10)

这是如此基本的算法。

$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);

Working demo

答案 3 :(得分:6)

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

  

我知道有一个名为max的函数,但是它不能像这样使用多维数组。

您可以使用array_column解决这个问题,这样可以轻松获得最大值:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<ul class="menu">
    <li>
        <a href="#">Everyday</a>
        <ul class="sub-menu">
            <li><a href="#">Sat</a></li>
            <li><a href="#">Sun</a></li>
            <li><a href="#">Mon</a></li>
            <li><a href="#">Tue</a></li>
            <li><a href="#">Wed</a></li>
            <li><a href="#">Thu</a></li>
            <li><a href="#">Fri</a></li>
        </ul>
    </li>
</ul>

获取关联键是一个有点棘手的地方,考虑到你可能真的想要多个键(如果$arr = [['message_id' => 1, 'points' => 3], ['message_id' => 2, 'points' => 2], ['message_id' => 3, 'points' => 2]]; // max value $max = max(array_column($arr, 'points')); 匹配多个值)。您可以使用array_map中的匿名函数执行此操作,并使用array_filter删除$max值:

null

<强>输出:

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

如果您最终使用多个键但只对找到的第一个匹配感兴趣,那么只需引用array(1) { [0]=> int(1) }

答案 4 :(得分:2)

另一个简单的方法是

$max  = array_map( function( $arr ) {
  global $last;
  return (int)( ( $arr["Total"] > $last ) ? $arr["Total"] : $last );
}, $array );

print_r( max( $max ) );

答案 5 :(得分:1)

你可以使用php usort功能: http://php.net/manual/en/function.usort.php

这里给出了一个很好的例子:

<?php
function cmp($a, $b)
{
 return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits, "cmp");

while (list($key, $value) = each($fruits)) {
 echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
?>

因此它会将最大值排序到最后一个数组索引。

输出:

$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons

此示例在上述链接

中给出

答案 6 :(得分:1)

可以使用array_walk完成(如果需要,可以使用array_walk_recursive)

$ arr是您要在

中搜索的数组
$largestElement = null;

array_walk($arr, function(&$item, $key) use (&$largestElement) {
    if (!is_array($largestElement) || $largestElement["Total"] < $item["Total"]) {
        $largestElement = $item;
    }
});

答案 7 :(得分:1)

<?php
$myarray = array(
    0 => array(
        'Key1' => 'Key1',
        'Total' => 13,
    ),
    1 => array(
        'Key2' => 'Key2',
        'Total' => 117,
    ),
    2 => array(
        'Key2' => 'Key3',
        'Total' => 39,
    ),
);

$out = array();
foreach ($myarray as $item) {
    $out[] = $item['Total'];
}

echo max($out); //117

unset($out, $item);

答案 8 :(得分:0)

array_reduce接受第三个“初始”参数。使用它来避免使用“ @”错误抑制的错误做法:

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

print_r($data);

PHP 7.4

$data = array_reduce($data, fn(a,b) => $a['Total'] > $b['Total'] ? $a : $b, ['Total' => 0]);