2010-02-03 71 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));