1. Hinweis
Die Erläuterungen in diesem Artikel sind größtenteils identisch mit denen unter „Den kleinsten Wert in einem Array finden”. Wesentlicher Unterschied ist nur die Verwendung von max() statt min(), ansonsten Beschränken sich die Unterschiede im Allgemeinen auf den Austausch von kleiner-als (<) durch größer-als (>).
2. Finden des größten Werts mit max()
An die praktische Funktion max() kann entweder ein Array von Werten (zum Beispiel max(array(1, 2, 3))) oder eine Menge von Werten als Parameter (zum Beispiel max(1, 2, 3)) übergeben werden. Die Funktion sucht dann aus allen übergebenen Werten den größten heraus und gibt diesen zurück. Das nachfolgende Beispiel demonstriert die Anwendung mit einem Array:
<?php $arr = array(17, 19, 4, 42, 99); $max = max($arr); var_dump($max); ?>
int(99)
3. foreach-Schleife
Will man die Suche nach dem Maximum selbst implementieren, dann ist der wohl einfachste Weg die Anwendung einer foreach-Schleife. Diese iteriert über jeden Wert im Array und vergleicht ihn mit dem bisher gefundenen Maximum. Falls der Wert größer ist, wird er als das neue Maximum übernommen. Eine weitere kleine Prüfung ist notwendig, um zu erkennen, ob es sich gerade um den ersten Wert handelt. In diesem Fall muss der Wert immer übernommen werden, da mit noch keinem vorherigem Wert verglichen werden kann.
<?php $arr = array(17, 19, 4, 42, 99); $max = null; foreach ($arr as $val) { // wenn $max noch nicht definiert wurde, wird der Wert immer uebernommen (ist beim ersten Element der Fall) // alternativ wird mit dem bisher niedrigsten Wert verglichen und der größere genommen // (Das ließe sich auch als ein verschachtelter bedingter Ausdruck schreiben, waere aber nur schwer lesbar.) if ($max===null) { $max = $val; } else { $max = ($val>$max ? $val : $max); } } var_dump($max); ?>
int(99)
Alternativ wäre im vorherigen Beispiel auch möglich:
- $max auf PHP_INT_MAX*(-1) (minimaler Integerwert) zu setzen. Dann könnte $max in der Schleife über schlicht ($val<$max ? $val : $max) definiert werden. Die zusätzliche Prüfung ob es sich um die erste Iteration handelt, würde wegfallen. Das Problem dabei: Das Array könnte Float-Werte enthalten, welche unterhalb von PHP_INT_MAX*(-1) liegen. Diese würden nicht erfasst werden. Die Lösung wäre daher nicht korrekt.
- Statt $max===null könnte man auch die aktuelle Iterationsnummer erfassen und prüfen, ob diese 0 ist. Das würde allerdings eine weitere Variable erfordern. Alternativ wäre es möglich, den aktuellen Array-Schlüssel über „foreach ($arr as $key=>$val)” in $key zu erfassen und diesen auszuwerten. Die Schlüssel im Array müssen aber nicht zwangsweise bei 0 beginnen, sodass auch diese Lösung manchmal fehlschlagen würde.
- $max könnte am Anfang auf den Wert des ersten Elements im Array gesetzt werden. Das lässt sich allerdings nicht so als Einzeiler formulieren, dass es auch mit leeren Arrays funktioniert, sowie mit solchen, deren Schlüssel nicht bei 0 beginnen.
4. Maxmimum über array_walk()
Die foreach-Schleife lässt sich ohne große Probleme durch die Funktion array_walk($array, $callback) ersetzen, welche über $array iteriert und auf jedes Element $callback anwendet. Die Zuweisung zu $max erfolgt letztlich weiterhin genauso.
<?php $arr = array(17, 18, 4, 42, 99); $max = null; array_walk($arr, function($val) use (&$max) { if ($max===null) { $max = $val; } else { $max = ($val>$max ? $val : $max); } }); var_dump($max); ?>
int(99)
5. array_reduce()
array_reduce($array, $callback, $start) wendet auf jedes Paar von Werten in $array die Funktion $callback an und ersetzt das Paar durch die Rückgabe der Funktion. Bei der ersten „Iteration” ist $start einer der beiden Werte. Hier wird über current($arr) der erste Wert im Array als Startwert vorgegeben. Das funktioniert aber nur dann, wenn der Array-Zeiger auf den ersten Wert (oder zumindest auf irgendeinen Wert im Array) gerichtet ist, sonst muss zuvor reset($arr) durchgeführt werden. Alternativ könnte auch eine Callback-Funktion ähnlich der bereits verwendeten übergeben werden. $start könnte dann auf NULL gesetzt werden.
<?php $arr = array(17, 18, 4, 42, 99); $max = array_reduce($arr, function($left, $right) { return ($left>$right ? $left : $right); }, current($arr)); var_dump($max); ?>
int(99)
6. Mit Schlüssel und Prüfung der Werte
In diesem Beispiel wird die weiter oben dargestellte foreach-Schleife ausgebaut. Nun soll sie nicht einfach den kleinsten Wert, sondern dessen Schlüssel zurückgeben. Das bietet etwas mehr Flexibilität (zum Beispiel könnte so der kleinste Wert im Array gesucht und gelöscht werden). Zudem prüft sie nun jeden Wert über is_int() darauf, ob es sich bei diesem überhaupt um einen Integer handelt.
<?php $arr = array(17, 18, 4, 42, 99); $maxKey = null; foreach ($arr as $key=>$val) { if (is_int($val)) { if ($maxKey===null || $val>$arr[$maxKey]) { $maxKey = $key; } } } echo("Der größte Wert ist {$arr[$maxKey]} mit dem Schlüssel $maxKey."); ?>
Der größte Wert ist 99 mit dem Schlüssel 4.
Die vorherige, angepasste foreach-Schleife kann leicht auch in eine spezielle Funktion ausgelagert werden. Diese wird hier als getKeyOfMax() bezeichnet, erwartet ein Array und gibt den Schlüssel des größten Werts zurück (oder NULL falls keiner gefunden wurde).
<?php function getKeyOfMax(array $arr) { $maxKey = null; foreach ($arr as $key=>$val) { if (is_int($val)) { if ($maxKey===null || $val>$arr[$maxKey]) { $maxKey = $key; } } } return $maxKey; } $arr = array(17, 18, 4, 42, 99); $maxKey = getKeyOfMax($arr); echo("Der größte Wert ist {$arr[$maxKey]} mit dem Schlüssel $maxKey."); ?>
Der größte Wert ist 99 mit dem Schlüssel 4.