Arithmetik mit PHP-Arrays

Array-Arithmetik & Array-Algorithmen

PHP bietet zahlreiche spezialisierte Funktionen zur Bearbeitung von → Arrays.
Auf dieser Seite werden Funktionen und Algorithmen im Zusammenhang mit Arrays vorgestellt.
Einzelne spezialisierte Aspekte wurden weggelassen, dafür andere für die Praxis wichtige Punkte genauer vorgestellt.
Diese Seite kann daher References oder Tutorials nicht ersetzen, sondern nur ergänzen.
PHP PHP Hypertext Processor, PHP-Arrays
Summe Arithmetische Summe der Werte aller Elemente
Count Häufigkeit des Auftretens von Werten
Reduce Berechnung eines Wertes aus einem Array
Map Berechnung eines Arrays aus mehreren Arrays

Sum

Funktion   array_sum()

berechnet die arithmetische Summe der Werte aller Elemente eines Arrays.

Mit Funktion range() wird ein Array $a mit allen ganzen Zahlen von 0 bis 5 erzeugt. Funktion array_sum() berechnet daraus die Summe.
$a = range(0,5);
$b = array_sum($a);
ergibt
$b = 0+1+2+3+4+5 = 15;

Count

Funktion   array_count_values()

zählt die Häufigkeit des Auftretens jedes einzelnen Wertes und gibt das Ergebnis als assoziatives Array zurück.
Jeder einzelne gefundene Wert wird als Schlüssel, die dazugehörende Häufigkeit als Wert zurückgegeben.
Die Zählung funktioniert nur, wenn das Array $a ausschließlich ganze Zahlen und / oder Texte (Strings) enthält.
$a = array('a','b','c','b','c','c');
$b = array_count_values($a);
ergibt
$b = array('a'=>1,'b'=>2,'c'=>3 );

Reduce

Funktion   array_reduce()

führt einen Algorithmus aus, in welchem alle Elemente eines Arrays an eine externe (Callback)-Funktion übergeben werden, und mit dem ein einziger Ergebnis-Wert berechnet wird.

Die Funktion array_reduce() erhält im einfachsten Fall 2 Argumente ($a,$cbf)
Die Werte aller Elemente von Array $a werden schrittweise an die Callback-Funktion $cbf übergeben.
Die Callback-Funktion erhält 2 Argumente ($z,$v).
Das Zwischenergebnis $z ist anfangs leer bzw. arithmetisch 0, der Wert $v stammt aus dem ersten Element $a[0]
Die Callback-Funktion berechnet ein Zwischenergebnis $z und gibt es zurück.
In jedem weiteren Schritt erhält die Callback-Funktion das letzte Zwischenergebnis und den Wert des nächsten Elements.
Das letzte berechnete Zwischenergebnis wird als Ergebnis der Funktion array_reduce() zurückgegeben.
function myred1($z,$v) {
$z = $z + $v;
return $z;
}

$a = range(1,5);
$b = array_reduce($a,"myred1");
ergibt
$b = 15;
Die einzelnen Schritte der Callback-Funktion:
$z = $z + $a[0] = 0 + 1 = 1;
$z = $z + $a[1] = 1 + 2 = 3;
$z = $z + $a[2] = 3 + 3 = 6;
$z = $z + $a[3] = 6 + 4 = 10;
$z = $z + $a[4] = 10 + 5 = 15;
Im ersten Beispiel wird mit Funktion range() ein Array $a mit allen ganzen Zahlen von 1 bis 5 erzeugt. Die Werte (1,2,3,4,5) werden schrittweise an die Callback-Funktion myred1() übergeben, gleichzeitig das zuletzt von dieser Funktion berechnete Zwischenergebnis. Daraus wird wie gezeigt der endgültige Wert $b=15 berechnet.
Die Arbeit dieser Funktion ist nicht einfach zu durchschauen, daher wird sie so ausführlich an einem so einfachen Beispiel demonstriert.
Das zweite Beispiel ist nur geringfügig anders aufgebaut:
Die Callback-Funktion myred2() berechnet das Produkt der Werte aller Array-Elemente. Jede Zahl ergibt mit 0 das Produkt 0, daher ergibt myred2 ohne Initialisierung immer den Wert 0.

Manche Funktionen - wie diese - benötigen einen Anfangswert für das Zwischenergebnis $z
Dieser wird als optionales 3. Argument an Funktion array_reduce() übergeben.
function myred2($z,$v) {
$z = $z * $v;
return $z;
}

$a = range(1,5);
$b = array_reduce($a,'myred2',1);
ergibt
$b = 1*2*3*4*5 = 720;

Map

Funktion   array_map()

erzeugt ein neues Array, in dem die Werte beliebig vieler Eingabe-Arrays nach einem individuellen Algorithmus verarbeitet sind. Der Algorithmus wird von einer externen (Callback)-Funktion bestimmt, welche das PHP-Programm zusätzlich enthalten muss.

Die Funktion erhält mindestens 2 Argumente ($cbn,$a)
$cbn ist der Name der Callback-Funktion, $a das zu verarbeitende Array. Wenn weitere Arrays zu verarbeiten sind, dann werden sie als zusätzliche Argumente übergeben.

Die Callback-Funktion (hier mymap1() ) erhält jeden einzelnen Wert des Arrays $a. Der von der Funktion zurückgegebene Wert wird in das Ergebnis kopiert.
Im Beispiel multipliziert die Callback-Funktion jeden Wert mit 10. Daher wird aus den Werten (0,1,2,3,4,5) von Array $a das Ergebnis (10,20,30,40,50) berechnet.
function mymap1($a) {
$r=$a*10;
return $r;
}

$a = range(0,5);
$z = array_map('mymap1',$a);
erzeugt
$b = array(0,10,20,30,40,50);
Funktion array_map() eignet sich auch für die Verarbeitung recht komplexer Probleme. Dazu einige Hinweise:
Alle Arrays in der Argumente-Liste sollten gleich lang sein, dann hat auch das Ergebnis die gleiche Länge.
Wenn ein Array der Ergebnis-Liste kürzer ist, dann werden alle Arrays nur bis zu dieser Länge verarbeitet.
Wenn ein Array der Ergebnis-Liste länger ist, dann werden die zusätzlichen Elemente ignoriert.
Wenn mehrere Arrays angegeben werden, dann wird in jedem Schritt der Berechnung je ein Element aus allen Arrays an die Callback-Funktion übergeben - Diese muss daher genauso viele Argumente akzeptieren, wie Arrays zu verarbeiten sind.

Im Beispiel werden die beiden Arrays $a und $b verarbeitet, welche beide die Länge 6 haben und ein Ergebnis $z der gleichen Länge erzeugen. Die Callback-Funktion mymap2() erhält in jedem Schritt $i je ein Element $a[$i] und $b[$i] und berechnet daraus ein Ergebnis $z[$i]
function mymap2($a,$b) {
$r=$a*$b;
return $r;
}

$a = range(0,5);
$b = array(1,1,2,2,3,3);
$z = array_map("mymap2",$a,$b);
ergibt
$z = array(1,1,4,6,12,15);
Diese Callback-Funktion verarbeitet 2 Argumente, die aus den 2 Arrays $a und $b geliefert werden.
Die Ergebnisse werden so berechnet:
$z[0] = $a[0] * $b[0] = 0 * 1 = 1;
$z[1] = $a[1] * $b[1] = 1 * 1 = 1;
$z[2] = $a[2] * $b[2] = 2 * 2 = 4;
$z[3] = $a[3] * $b[3] = 3 * 2 = 6;
$z[4] = $a[4] * $b[4] = 4 * 3 = 12;
$z[5] = $a[5] * $b[5] = 5 * 3 = 15;