1. array_chunk
Die Funktion array_chunk($array, $size) nimmt ein Array $array entgegen und teilt dieses in „Blöcke” auf, die jeweils (maximal) $chunkSize Werte enthalten. Die Rückgabe ist daher ein mehrdimensionales Array.
Im nächsten Beispiel wird zunächst ein Array definiert, welches die Zahlen von 1 bis 105 als Werte enthält. Mittels array_chunk() wird dieses Array in Blöcke von jeweils maximal 10 Elementen eingeteilt, wodurch sich 10 Blöcke von je 10 Elementen und ein Block von 5 Elementen ergeben. Am Ende werden diese Blöcke ausgegeben, wobei die Werte jedes einzelnen Blocks jeweils in einen kommagetrennten String umgewandelt werden.
<?php $arr = range(1, 105); $chunks = array_chunk($arr, 10); // Ausgabe foreach ($chunks as $key=>$chunk) { echo("$key: " . implode(', ', $chunk) . "\n"); } ?>
0: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 1: 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 2: 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 3: 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 4: 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 5: 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 6: 61, 62, 63, 64, 65, 66, 67, 68, 69, 70 7: 71, 72, 73, 74, 75, 76, 77, 78, 79, 80 8: 81, 82, 83, 84, 85, 86, 87, 88, 89, 90 9: 91, 92, 93, 94, 95, 96, 97, 98, 99, 100 10: 101, 102, 103, 104, 105
2. Eine eigene Implementierung der Funktion array_chunk()
Nachfolgend wird beispielhaft erläutert, wie die Funktionsweise von array_chunk() durch eigenen Code nachgebildet werden könnte. Das Vorgehen ist dabei vergleichsweise einfach: Es wird eine foreach-Schleife implementiert, welche über alle Elemente im (Beispiel-)Array $arr iteriert. Während des Iterierens werden zwei Arrays, $out und $current, gebildet. $out enthält am Ende das Ergebnisarray (ursprüngliches Array eingeteilt in Zehnerblöcke), $current wird jeweils Stück für Stück mit bis zu zehn Elementen gefüllt, dann in $out geschrieben und wieder geleert. Entsprechend überträgt die foreach-Schleife während des Iterierens jedes Element in $current und prüft anschließend, ob entweder $current voll ist (zehn Elemente enthält) oder alternativ das Ende des Arrays $arr erreicht wurde. Falls einer dieser Punkte erfüllt ist, wird $current an $out angehängt und mit einem leeren Array überschrieben.
<?php $arr = range(1, 105); $out = array(); $current = array(); foreach ($arr as $key=>$val) { $current[] = $val; if (isset($current[9]) || !isset($arr[$key + 1])) { $out[] = $current; $current = array(); } } // Ausgabe foreach ($out as $key=>$chunk) { echo("$key: " . implode(', ', $chunk) . "\n"); } ?>
0: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 1: 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 2: 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 3: 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 4: 41, 42, 43, 44, 45, 46, 47, 48, 49, 50 5: 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 6: 61, 62, 63, 64, 65, 66, 67, 68, 69, 70 7: 71, 72, 73, 74, 75, 76, 77, 78, 79, 80 8: 81, 82, 83, 84, 85, 86, 87, 88, 89, 90 9: 91, 92, 93, 94, 95, 96, 97, 98, 99, 100 10: 101, 102, 103, 104, 105
Der zuvor auf Blöcke von 10 Werten ausgelegte Code soll nun verallgemeinert werden. Dazu wird eine Funktion chunkValues($values, $chunkSize) definiert, welche das Array $values in Blöcke einteilt, die jeweils maximal $chunkSize Elemente enthalten. Der Code der Funktion ist nahezu identisch mit dem vorherigen Beispiel. Diesmal wird am Anfang noch array_values($values) ausgeführt, um sicherzustellen, dass das Array fortlaufend durchnummeriert ist (0, 1, 2, 3, ...). (array_values() gibt die Werte des übergebenen Arrays mit neuen Schlüsseln von 0 bis n zurück.) Zudem wurde die Bedingung isset($current[9]) abstrahiert und durch isset($current[$chunkSize - 1]) ersetzt.
<?php function chunkValues($values, $chunkSize) { $values = array_values($values); $out = array(); $current = array(); foreach ($values as $key=>$val) { $current[] = $val; if (isset($current[$chunkSize - 1]) || !isset($values[$key + 1])) { $out[] = $current; $current = array(); } } return $out; } $arr = range(1, 105); $chunks = chunkValues($arr, 13); // Ausgabe foreach ($chunks as $key=>$chunk) { echo("$key: " . implode(', ', $chunk) . "\n"); } ?>
0: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 1: 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 2: 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 3: 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 4: 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65 5: 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78 6: 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91 7: 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104 8: 105