Pubblicato il

array_merge di PHP utilizzato in un ciclo è una pessima pratica

Autori
PHP

Utilizzare la funzione array_merge in un ciclo for / foreach / while come in questo modo:

$arraysToMerge = [ [1, 2], [2, 3], [5, 8] ];

$arraysMerged = [];
foreach($arraysToMerge as $array) {
    $arraysMerged = array_merge($arraysMerged, $array);
}

è una pessima pratica 😱 perché è un killer di prestazioni (soprattutto di memoria).

Da PHP 5.6, c'è un nuovo operatore, l'operatore spread

$arraysToMerge = [ [1, 2], [2, 3], [5,8] ];

$arraysMerged = array_merge([], ...$arraysToMerge);
print_r($arraysMerged);

output

Array
(
    [0] => 1
    [1] => 2
    [2] => 2
    [3] => 3
    [4] => 5
    [5] => 8
)

che espande in automatico l'array senza la necessità di ciclarlo.

  • niente più problemi di prestazioni
  • nessun ciclo for / foreach / while
  • processato in una singola riga di codice

Un esempio più complesso può essere rappresentato dal seguente caso:

  • ho un elenco di studenti
  • per ognuno di essi devo recuperare i libri usati
  • devo memorizzarli in una nuova struttura array

E' possibile utilizzare l'operatore spread, ma è necessario un processo intermedio:

// struttura dati studenti
$students = [['id'=>1],['id'=>2],['id'=>3]];

// recupera i libri usati per ID studente
function searchUsedBooksByStudent($id) {
    $books = [];
    $books[1] = ['italiano', 'storia'];
    $books[2] = ['matematica'];
    $books[3] = ['latino'];
    if (isset($books[$id])) {
        return $books[$id];
    }
    return [];
}


$arrayUsedBooks = [];
foreach ($students as $student) {
    $books = searchUsedBooksByStudent($student['id']);
    if ($books) {
      $arrayUsedBooks[] = $books;
    }
}
$arraysMerged = array_merge([], ...$arrayUsedBooks);
print_r($arraysMerged);

output

 Array
(
    [0] => italiano
    [1] => storia
    [2] => matematica
    [3] => latino
)

Spero ti siano utili questi esempi, guarda ora il tuo codice per capire cosa puoi migliorare!!!

Buon lavoro 👨‍💻