PHP Filtrare una matrice


Esempio

Per filtrare i valori da una matrice e ottenere un nuovo array contenente tutti i valori che soddisfano la condizione del filtro, è possibile utilizzare la funzione array_filter .

Filtro di valori non vuoti

Il caso più semplice di filtraggio è quello di rimuovere tutti i valori "vuoti":

$my_array = [1,0,2,null,3,'',4,[],5,6,7,8];
$non_empties = array_filter($my_array); // $non_empties will contain [1,2,3,4,5,6,7,8]; 

Filtro per callback

Questa volta definiamo la nostra regola di filtraggio. Supponiamo di voler ottenere solo numeri pari:

$my_array = [1,2,3,4,5,6,7,8];

$even_numbers = array_filter($my_array, function($number) {
    return $number % 2 === 0;   
});

La funzione array_filter riceve l'array da filtrare come primo argomento e un callback che definisce il predicato del filtro come secondo.

5.6

Filtro per indice

Un terzo parametro può essere fornito alla funzione array_filter , che consente di modificare i valori passati al callback. Questo parametro può essere impostato su ARRAY_FILTER_USE_KEY o ARRAY_FILTER_USE_BOTH , il che comporterà la richiamata che riceve la chiave anziché il valore per ciascun elemento nell'array, o sia il valore sia la chiave come argomenti. Ad esempio, se vuoi trattare con gli indici di valori:

$numbers = [16,3,5,8,1,4,6];

$even_indexed_numbers = array_filter($numbers, function($index) {
    return $index % 2 === 0;
}, ARRAY_FILTER_USE_KEY);

Indici nella matrice filtrata

Nota che array_filter conserva le chiavi dell'array originale. Un errore comune sarebbe provare un uso for ciclo sull'array filtrato:

<?php

$my_array = [1,0,2,null,3,'',4,[],5,6,7,8];
$filtered = array_filter($my_array); 

error_reporting(E_ALL); // show all errors and notices

// innocently looking "for" loop
for ($i = 0; $i < count($filtered); $i++) {
   print $filtered[$i];
}

/*
Output:
1
Notice: Undefined offset: 1
2
Notice: Undefined offset: 3
3
Notice: Undefined offset: 5
4
Notice: Undefined offset: 7
*/

Ciò accade perché i valori che erano sulle posizioni 1 (c'era 0 ), 3 ( null ), 5 (stringa vuota '' ) e 7 (array vuoto [] ) sono stati rimossi insieme alle corrispondenti chiavi di indice.

Se è necessario eseguire il loop del risultato di un filtro su un array indicizzato, è necessario innanzitutto chiamare array_values sul risultato di array_filter per creare un nuovo array con gli indici corretti:

$my_array = [1,0,2,null,3,'',4,[],5,6,7,8];
$filtered = array_filter($my_array); 
$iterable = array_values($filtered);

error_reporting(E_ALL); // show all errors and notices

for ($i = 0; $i < count($iterable); $i++) {
   print $iterable[$i];
}

// No warnings!