38

问题

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

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

有任何想法吗?

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

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

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

9 回答 9

89

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

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

于 2017-04-11T12:20:47.213 回答
30

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

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

print_r($data);

观看现场演示

于 2013-06-27T09:30:26.397 回答
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);

工作演示

于 2013-06-27T09:40:41.387 回答
9

我知道这个问题很老,但我提供以下答案来回答另一个在被标记为重复后指出的问题。这是我在当前答案中没有提到的另一种选择。

我知道有一个名为 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'));

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

输出:

array(1) {
  [0]=>
  int(1)
}

如果您最终得到了多个键,但只对找到的第一个匹配项感兴趣,那么只需引用$keys[0].

于 2016-12-27T15:55:21.733 回答
3

另一种简单的方法是

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

print_r( max( $max ) );
于 2013-06-27T11:16:46.440 回答
2
<?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);
于 2017-11-12T10:40:52.787 回答
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

此示例在上述链接中给出

于 2013-06-27T09:34:58.373 回答
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;
    }
});
于 2017-04-20T07:12:01.117 回答
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]);
于 2020-01-23T14:46:02.453 回答