PHP Filtrage d'un tableau


Exemple

Pour filtrer les valeurs d'un tableau et obtenir un nouveau tableau contenant toutes les valeurs correspondant à la condition du filtre, vous pouvez utiliser la fonction array_filter .

Filtrage des valeurs non vides

Le cas le plus simple de filtrage est de supprimer toutes les valeurs "vides":

$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]; 

Filtrage par rappel

Cette fois, nous définissons notre propre règle de filtrage. Supposons que nous voulons obtenir uniquement des nombres pairs:

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

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

La fonction array_filter reçoit le tableau à filtrer en tant que premier argument, et un rappel définissant le prédicat de filtre en tant que second argument.

5.6

Filtrage par index

Un troisième paramètre peut être fourni à la fonction array_filter , qui permet de modifier les valeurs transmises au rappel. Ce paramètre peut être défini sur ARRAY_FILTER_USE_KEY ou ARRAY_FILTER_USE_BOTH , ce qui entraînera la réception de la clé par le rappel au lieu de la valeur de chaque élément du tableau, ou à la fois de la valeur et de la clé comme arguments. Par exemple, si vous voulez traiter des index au lieu de valeurs:

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

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

Index dans un tableau filtré

Notez que array_filter conserve les clés de tableau d'origine. Une erreur commune serait d'essayer une utilisation for boucle sur le tableau filtré:

<?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
*/

Cela se produit parce que les valeurs qui étaient sur les positions 1 (il y avait 0 ), 3 ( null ), 5 (chaîne vide '' ) et 7 (tableau vide [] ) ont été supprimées avec leurs clés d’index correspondantes.

Si vous devez parcourir le résultat d'un filtre sur un tableau indexé, vous devez d'abord appeler array_values sur le résultat de array_filter afin de créer un nouveau tableau avec les index corrects:

$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!