从多维数组中的元素中获取最大值?

时间:2010-02-03 03:26:57

标签: php arrays max multidimensional-array

我正在尝试为多维数组中的特定键选择最大值。我无法“找到”有问题的钥匙......

所以,数组(比我在这里发布的文章要长得多)

[0] => stdClass Object
    (
        [id] => 70
        [cust] => 4
        [dnum] => 1
        [upper] => Array
            (
                [0] => 66
            )

    )
[1] => stdClass Object
    (
        [id] => 43
        [cust] => 42
        [dnum] => 2
        [upper] => Array
            (
                [0] => 77
            )

    )
[2] => stdClass Object
    (
        [id] => 12
        [cust] => 3
        [dnum] => 0
        [upper] => Array
            (
                [0] => 99
            )

    )

我试图在整个数组中找到最大的“dnum”值,所以在这个例子中,$ max = 2.我知道max函数允许我这样做,但我不知道如何引用dnum元素而不将整个东西放在foreach循环中,如果我这样做,那么max将不是要使用的函数,对吧?

所以,我不能完全这样做:

$max = max($myarray[]->dnum);

有没有办法让我无需重新创建整个数组?

5 个答案:

答案 0 :(得分:21)

在PHP 5.2中,唯一的方法是遍历数组。

$max = null;
foreach ($arr as $item) {
  $max = $max === null ? $item->dnum : max($max, $item->dnum);
}

注意:我已将结果设为0,因为如果所有dnum值都为负数,则现在接受的解决方案将产生不正确的结果。你需要用合理的东西播种最大值。

或者您可以使用array_reduce()

$max = array_reduce($arr, 'max_dnum', -9999999);

function max_denum($v, $w) {
  return max($v, $w->dnum);
}

在PHP 5.3+中,您可以使用匿名函数:

$max = array_reduce($arr, function($v, $w) {
  return max($v, $w->dnum);
}, -9999999);

您也可以使用array_map()

function get_dnum($a) {
  return $a->dnum;
}

$max = max(array_map('get_dnum', $arr));

答案 1 :(得分:10)

$max = 0;
foreach($array as $obj)
{
    if($obj->dnum > $max)
    {
        $max = $obj->dnum;
    }
}

如果您的最高数字不是负数(负数,空数组和0将最大值返回0),该函数将正常工作。

因为您正在使用可以具有自定义属性/结构的对象,所以我不相信您可以使用任何“预定义”函数来获取它。不妨使用foreach循环。

你真的无法摆脱foreach循环,因为即使内部函数使用foreach循环,它也只是在幕后。

另一种解决方案是

$numbers = array();
foreach($array as $obj)
{
    $numbers[] = $obj->dnum;
}
$max = max($numbers);

答案 2 :(得分:4)

最简单的方法可能就是你最初的想法,即将数组循环一次,然后将所有dnum个键拉出到一个单独的数组中,然后在其上调用max()

$out = array();
foreach($myarray as $obj) {
    $out[] = $obj->dnum;
}
echo max($out);

您可以在不创建单独数组的情况下执行此操作,但最终会更频繁地调用max()。两者之间的性能/内存使用情况会有所不同,您可以随时对其进行基准测试:

$first = $myarray[0];  //assume zero start index
$max = $first->dnum;
foreach($myarray as $obj) {
    $max = max($max,$obj->dnum);
}
echo $max;

唯一可行的方法是使用usort()对数组进行排序,并根据对象dnum属性对自定义排序函数进行排序。这可能比循环你的数组慢得多,所以我不认为我会推荐它,除非你需要将数组排序为副作用。

答案 3 :(得分:3)

如果你喜欢oneliners

$max = max( array_map(function( $row ){ return $row->dnum; }, $myarray) );

答案 4 :(得分:1)

对于仍然有兴趣的人,请尝试此...

 $min = min(array_column($myarray, 'dnum'));
 $max = max(array_column($myarray, 'dnum'));