Alle Werte in einem Array multiplizieren (Thema: PHP Beispiele)

Wie man alle numerischen Werte eines Arrays in PHP miteinander multipliziert

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-Code
<?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
?>

HTML-Code
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-Code
<?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);
?>

HTML-Code
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-Code
<?php
	$arr = array(5, 5, 10);
	$product = 1;
	array_walk($arr, function($val, $key) use (&$product) {
		$product *= $val;
	});
	var_dump($product);
?>

HTML-Code
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-Code
<?php
	$arr = array(5, 5, 10);
	$product = 1;
	array_filter($arr, function($val) use (&$product) {
		$product *= $val;
		return true;
	});
	var_dump($product);
?>

HTML-Code
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-Code
<?php
	$arr = array(10, 10, 10);
	$product = array_reduce($arr, function($left, $right) {
		return $left * $right;
	}, 1);
	var_dump($product);
?>

HTML-Code
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-Code
<?php
	$arr = array(5, 5, array(1, 10));
	$product = 1;
	array_walk_recursive($arr, function($val, $key) use (&$product) {
		$product *= $val;
	});
	var_dump($product);
?>

HTML-Code
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-Code
<?php
	$arr = array(1 => 'a', 2 => 'b', 3 => 'c');
	var_dump(array_product(array_keys($arr)));
?>

HTML-Code
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-Code
<?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));
?>

HTML-Code
int(6)
Array
(
    [1] => 7
    [2] => 8
)
int(56)


Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung. OK