1. Hinweis
Dieser Artikel ist sehr ähnlich zu „Alle Werte in einem Array addieren”. Unterschiedlich ist hier in erster Linie nur die Verwendung von array_product() statt array_sum(), einige veränderte Rechenoperationen und eine etwas andere Anwendung von array_reduce(); Wer den genannten Artikel also bereits gelesen hat, braucht diesen hier nur noch kurz zu überfliegen.
2. array_product()
Die Standardfunktion zum Berechnen des Produkts aller Elemente in einem Array ist array_product($array). Die Rückgabe ist ein Integer oder ein Float-Wert.
<?php $arr = array(10, 10, 10); var_dump(array_product($arr)); // 1000 $arr = array(1, 2, 3); var_dump(array_product($arr)); // 6 $arr = array(10, 10, 10, 0.1, 0.1, 0.1); var_dump(array_product($arr)); // 1 $arr = array(1, 1.5); var_dump(array_product($arr)); // 1.5 ?>
int(1000) int(6) float(1) float(1.5)
3. Eigene foreach-Schleife zur Produktberechnung
Ebenfalls ist die Berechnung des Produkts mit einer foreach-Schleife möglich. Jeder einzelne Wert muss dann mit dem Produkt der vorherigen Werte multipliziert werden, beginnend mit 1. Eine Schleife ist langsamer als array_product(), erlaubt dem Entwickler aber mehr Flexibilität. So könnte etwa jeder Wert zunächst darauf geprüft werden, ob es sich um einen Float handelt und diesen dann entsprechend ignoriert werden.
<?php $arr = array(10, 10, 10, 1.5); $product = 1; foreach ($arr as $key=>$val) { // Hier nur Integer multiplizieren if (is_int($val)) { $product *= $val; } } var_dump($product); ?>
int(1000)
4. Produkt mit array_walk() berechnen
Sehr ähnlich zur foreach-Schleife ist die Anwendung von array_walk($array, $callback), welches über alle Elemente in $array iteriert und jedes mal $callback mit dem Wert und dem Schlüssel des Elements aufruft. Entsprechend muss die Callback-Funktion bei jedem Aufruf nur eine zwischengespeicherte Variable (hier: $product) mit dem aktuellen Wert multiplizieren.
<?php $arr = array(5, 5, 10); $product = 1; array_walk($arr, function($val, $key) use (&$product) { $product *= $val; }); var_dump($product); ?>
int(250)
5. Produkt mit array_filter() berechnen
Ähnlich wiederum zu array_walk() kann array_filter($array, $callback) angewendet werden. Diese Funktion ist eigentlich dazu gedacht, aus $array bestimmte Werte herauszufiltern. (Welche genau das sind, soll dann von der Callback-Funktion bestimmt werden.) Sie lässt sich aber auch zum Iterieren über das Array zweckentfremden, indem für jedes Element zurückgegeben wird, dass es Teil des Arrays bleiben soll. Die Anwendung erfolgt analog zu array_walk(): In der Callback-Funktion wird eine zwischengespeicherte Variable $product jeweils mit dem aktuellen Wert multipliziert. Zusätzlich muss noch für jeden Wert ein (bool)true zurückgegeben werden, sodass array_filter() diesen im Array belässt.
<?php $arr = array(5, 5, 10); $product = 1; array_filter($arr, function($val) use (&$product) { $product *= $val; return true; }); var_dump($product); ?>
int(250)
6. Produkt mit array_reduce() berechnen
In Anlehnung an die funktionale Programmierung kann array_reduce($array, $callback) verwendet werden. Diese Funktion wendet auf jedes Paar aus zwei Werten die Funktion $callback an und ersetzt das Paar durch die Rückgabe selbiger Callback-Funktion. Dieser Vorgang wird so lange wiederholt, bis $array nur noch aus einem Wert besteht, welcher dann wiederum von array_reduce zurückgegeben wird. Als dritter Parameter kann an array_reduce() ein Startwert übergeben werden. Dieser wird bei der ersten „Iteration” benötigt, da sonst einer der beiden Werte NULL ist. Er wird hier auf (int)1 gestellt, was zur Multiplikation passt.
<?php $arr = array(10, 10, 10); $product = array_reduce($arr, function($left, $right) { return $left * $right; }, 1); var_dump($product); ?>
int(1000)
7. Bei mehrdimensionalem Array
Auf mehrdimensionale Arrays kann array_product() nicht angewendet werden. In diesen Fällen sollte auf das Vorgehen aus array_walk() zurückgegriffen werden. Statt array_walk() muss allerdings array_walk_recursive($array, $callback) verwendet werden. Diese Funktion wendet $callback rekursiv auf alle Elemente an. Auch über Unterarrays wird also iteriert.
<?php $arr = array(5, 5, array(1, 10)); $product = 1; array_walk_recursive($arr, function($val, $key) use (&$product) { $product *= $val; }); var_dump($product); ?>
int(250)
8. Produkt aller Schlüssel im Array
Will man nicht das Produkt der Werte, sondern stattdessen das Produkt aller Schlüssel bestimmen, dann sollte zuvor ein Array aller Schlüssel gebildet werden, indem man array_keys($array) auf das Ausgangsarray anwendet. Auf die Rückgabe von array_keys() kann dann wiederum array_product() angewendet werden, da die Werte der besagten Rückgabe den Schlüsseln im Ausgangsarray entsprechen.
<?php $arr = array(1 => 'a', 2 => 'b', 3 => 'c'); var_dump(array_product(array_keys($arr))); ?>
int(6)
Ebenfalls möglich ist es, Schlüssel und Werte im Array miteinander zu vertauschen. Dies kann über array_flip($array) erreicht werden. Der Weg kann aber nur dann angewendet werden, wenn man sich sicher ist, dass jeder Wert im Ausgangsarray einmalig ist. Andernfalls müssten sich im „vertauschten” Array mehrere ehemalige Werte den selben Schlüssel teilen. Da dies nicht möglich ist, würden entsprechend mehrere Werte wegfallen und nur noch einer übrig bleiben. Die zugehörigen Schlüssel, die diesen Werten vor dem Vertauschen zugeordnet waren, würden dann ebenfalls wegfallen.
<?php $arr = array(1 => 'a', 2 => 'b', 3 => 'c'); $flipped = array_flip($arr); var_dump(array_product($flipped)); // Das funktioniert nicht korrekt, da nicht jeder Wert einmalig ist $arr = array(5 => 1, 6 => 1, 7 => 1, 8 => 2); $flipped = array_flip($arr); print_r($flipped); var_dump(array_product($flipped)); ?>
int(6) Array ( [1] => 7 [2] => 8 ) int(56)