2010-02-03 7 views
11

Ich versuche, den maximalen Wert für einen bestimmten Schlüssel in einem mehrdimensionalen Array auszuwählen. Ich habe Probleme „immer auf“ den Schlüssel in Frage ...Erhalten Sie den maximalen Wert von einem Element in einem mehrdimensionalen Array?

Also, das Array (die als wesentlich langwieriger ist, was ich bin Entsendung hier)

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

    ) 

Ich versuche, finde den maximalen "dnum" -Wert über das gesamte Array, also in diesem Beispiel $ max = 2. Ich weiß, dass mir die max-Funktion dies ermöglicht, aber ich bin mir nicht sicher, wie ich das dnum-Element referenzieren soll, ohne das Ganze zu setzen sache in einer foreach-schleife, und wenn ich das tue, dann wäre max nicht die zu verwendende funktion, oder?

Also, ich kann nicht genau dies tun:

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

Gibt es eine Möglichkeit für mich, dies zu tun, ohne das gesamte Array neu erstellen zu müssen?

+0

@Felix Kling: Warum würden Sie eine solche __MINOR__ Profil bearbeiten und diese Frage wieder aktivieren? –

+0

@Pranav: Aufräumen .... Tags gehören nicht in den Titel. –

Antwort

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

Diese Funktion wäre richtig, wenn Ihre höchste Zahl nicht negativ ist (Negativ, leere Arrays und 0er den max als 0 zurückkehren).

Da Sie ein Objekt verwenden, das benutzerdefinierte Eigenschaften/Strukturen haben kann, glaube ich nicht, dass es wirklich irgendwelche "vordefinierten" Funktionen gibt, die Sie verwenden können, um es zu bekommen. Könnte auch einfach eine foreach-Schleife verwenden.

Sie können wirklich nicht von einer foreach-Schleife wegkommen, da sogar interne Funktionen eine foreach-Schleife verwenden, es ist nur hinter den Kulissen.

Eine andere Lösung ist

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

In PHP 5.2 die einzige Möglichkeit, dies ist eine Schleife durch das Array zu tun.

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

Hinweis: ich das Ergebnis mit 0 ausgesät haben, denn wenn alle dnum Werte negativ sind dann die jetzt akzeptierte Lösung wird ein falsches Ergebnis. Sie müssen das Maximum mit etwas vernünftigem säen.

Alternativ können Sie array_reduce() verwenden:

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

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

In PHP 5.3+ Sie eine anonyme Funktion verwenden können:

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

Sie array_map() verwenden:

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

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

Verdammt Sie und Ihre Verwendung von alternativen Snytaxen! (Scherz) –

+0

+1 Für die Verwendung von 'max()' :) Ich sehe selten, dass irgendwelche Spielzeit bekommen. – Sampson

+1

Danke für die verschiedenen Optionen! Ich glaube, dass "array_map" seine Argumente andersherum verwendet ([relevantes Dokument] (http://php.net/manual/en/function.array-map.php)), so dass die letzte Lösung "$ max = max" sein sollte (array_map ('get_dnum', $ arr)); ' – Robin

4

Die einfachste Der Weg ist wahrscheinlich Ihr erster Gedanke, Ihr Array einmal zu loopen Und ziehen alle dnum Schlüssel in einem separaten Array, dann rufen Sie max() auf, dass:

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

Sie es tun könnte ein separates Array ohne erstellen, aber Sie werden am Ende max() öfter viel telefonieren.Performance/Speichernutzung wird anders sein zwischen den beiden, könnte man immer Benchmark es:

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

Der einzige andere Weg Sie es gehen könnte, wäre das Array zu sortieren usort() verwenden und eine Sortier benutzerdefinierte Funktion die Aufgabe zugrunde, dnum Eigenschaften. Dies wird wahrscheinlich sehr viel langsamer sein, als nur das Array zu durchlaufen, also denke ich nicht, dass ich es empfehlen würde, wenn Sie das Array nicht als Nebeneffekt sortiert hätten.

+0

Wow, hart auf den Schlag schlagen. Ich muss viel weniger Zeit mit Tippen verbringen. : D – zombat

+0

+1 Ich kenne das Gefühl :) – Sampson

3

Wenn Sie oneliners wie

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