2010-02-03 72 views
11

我试图选择多维数组中特定键的最大值。我无法“进入”问题的关键...从多维数组中的元素获取最大值?

所以,数组(这是比我在这里发帖更长时间)

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

有我的方式做到这一点,而无需重新创建整个阵列?

+0

@Felix克林:你为什么会做出这样的__MINOR__编辑和重新激活了这个问题? – 2012-03-17 12:53:24

+0

@Pranav:清理....标签不属于标题。 – 2012-03-17 12:55:16

回答

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); 
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)); 
+0

该死的你和你的替代snytaxes的使用! (开玩笑) – 2010-02-03 03:36:56

+0

+1对于使用'max()':)我很少看到有任何播放时间。 – Sampson 2010-02-03 03:42:54

+1

感谢您的不同选择!我相信'array_map'采用其他方式的参数([相关文档](http://php.net/manual/en/function.array-map.php)),所以最后的解决方案应该是'$ max = max (array_map('get_dnum',$ arr));' – Robin 2015-05-14 10:08:24

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属性。这可能会比循环你的数组慢得多,所以我不认为我会推荐它,除非你需要将数组排序为副作用。

+0

哇,严重击败了一拳。我需要花更少的时间打字。 :D – zombat 2010-02-03 03:41:22

+0

+1我知道这种感觉:) – Sampson 2010-02-03 03:51:54

3

如果你喜欢oneliners

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