web-dev-qa-db-fra.com

Comment filtrer un tableau par une condition

J'ai un tableau comme celui-ci:

array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2)

Maintenant, je veux filtrer ce tableau par une condition et ne garder que les éléments où la valeur est égale à 2 et supprimer tous les éléments où la valeur n'est PAS 2.

Donc, mon tableau de résultats attendu serait:

array("a" => 2, "c" => 2, "f" => 2)

Remarque: je souhaite conserver les clés du tableau d'origine.

Comment puis-je faire cela avec PHP? Des fonctions intégrées?

24
menardmam
$fullarray = array('a'=>2,'b'=>4,'c'=>2,'d'=>5,'e'=>6,'f'=>2);


function filterArray($value){
    return ($value == 2);
}

$filteredArray = array_filter($fullArray, 'filterArray');

foreach($filteredArray as $k => $v){
    echo "$k = $v";
}
49
Simon

Vous devez en quelque sorte parcourir votre tableau et filtrer chaque élément en fonction de votre condition. Cela peut être fait avec différentes méthodes.

Boucles while / for / foreach méthode

Parcourez votre tableau avec la boucle de votre choix, que ce soit while, for ou foreach. Ensuite, vérifiez simplement votre condition et unset() les éléments s'ils ne remplissent pas votre condition ou écrivez les éléments qui remplissent la condition dans un nouveau tableau.

Boucle

//while loop
while(list($key, $value) = each($array)){
    //condition
}

//for loop
$keys = array_keys($array);
for($counter = 0, $length = count($array); $counter < $length; $counter++){
    $key = $keys[$counter];
    $value = $array[$key];
    //condition 
}

//foreach loop
foreach($array as $key => $value){
    //condition
}

État

Placez simplement votre condition dans la boucle où se trouve le commentaire //condition. La condition peut simplement vérifier ce que vous voulez, puis vous pouvez soit unset() les éléments qui ne répondent pas à votre condition, et réindexer le tableau avec array_values() si vous le souhaitez, ou écrivez les éléments dans un nouveau tableau qui remplissent la condition.

//Pseudo code
//Use one of the two ways
if(condition){  //1. Condition fulfilled
    $newArray[ ] = $value;
            //↑ Put '$key' there, if you want to keep the original keys
            //Result array is: $newArray

} else {        //2. Condition NOT fulfilled
    unset($array[$key]);
    //Use array_values() after the loop if you want to reindex the array
    //Result array is: $array
}

array_filter() méthode

Une autre méthode consiste à utiliser la fonction intégrée array_filter(). Cela fonctionne généralement à peu près comme la méthode avec une boucle simple.

Il vous suffit de renvoyer TRUE si vous souhaitez conserver l'élément dans le tableau et FALSE si vous souhaitez supprimer l'élément du tableau de résultat.

//Anonymous function
$newArray = array_filter($array, function($value, $key){
    //condition
}, ARRAY_FILTER_USE_BOTH);

//Function name passed as string
function filter($value, $key){
    //condition
}
$newArray = array_filter($array, "filter", ARRAY_FILTER_USE_BOTH);

//'create_function()', NOT recommended
$newArray = array_filter($array, create_function('$value, $key', '/* condition */'), ARRAY_FILTER_USE_BOTH);

preg_grep() méthode

preg_grep() est similaire à array_filter() juste qu'il n'utilise que des expressions régulières pour filtrer le tableau. Donc, vous ne pourrez peut-être pas tout faire avec, car vous ne pouvez utiliser qu'une expression régulière comme filtre et vous ne pouvez filtrer que par valeurs ou avec plus de code par clés.

Notez également que vous pouvez passer le drapeau PREG_GREP_INVERT Comme troisième paramètre pour inverser les résultats.

//Filter by values
$newArray = preg_grep("/regex/", $array);

Conditions communes

Il existe de nombreuses conditions courantes utilisées pour filtrer un tableau dont toutes peuvent être appliquées à la valeur et/ou à la clé du tableau. Je vais en énumérer quelques-uns ici:

//Odd values
return $value & 1;

//Even values
return !($value & 1);

//NOT null values
return !is_null($value);

//NOT 0 values
return $value !== 0;

//Contain certain value values
return strpos($value, $needle) !== FALSE;  //Use 'use($needle)' to get the var into scope

//Contain certain substring at position values
return substr($value, $position, $length) === $subString;

//NOT 'empty'(link) values
array_filter($array);  //Leave out the callback parameter
24
Gumbo

Vous pouvez parcourir les copies des clés pour pouvoir utiliser unset() dans la boucle:

foreach (array_keys($array) as $key) {
    if ($array[$key] != 2)  {
        unset($array[$key]);
    }
}

L'avantage de cette méthode est l'efficacité de la mémoire si votre tableau contient de grandes valeurs - elles ne sont pas dupliquées.

EDIT Je viens de remarquer que vous n'avez en fait besoin que des clés qui ont une valeur de 2 (vous connaissez déjà la valeur):

$keys = array();
foreach ($array as $key => $value) {
    if ($value == 2)  {
        $keys[] = $key;
    }
}
3
soulmerge

Cela devrait fonctionner, mais je ne suis pas sûr de son efficacité car vous finissez probablement par copier beaucoup de données.

$newArray = array_intersect_key(
                  $fullarray, 
                  array_flip(array_keys($fullarray, 2))
            );
2
Tom Haigh

Je pense que la fonction intégrée la plus lisible et la plus lisible est: array_intersect ()

Code: ( Démo )

$array = array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2);
var_export(array_intersect($array, [2]));

Production:

array (
  'a' => 2,
  'c' => 2,
  'f' => 2,
)

Assurez-vous simplement de déclarer le 2e paramètre sous forme de tableau car il s'agit du type de valeur attendu.

Maintenant, il n'y a rien de mal à écrire une boucle foreach ou à utiliser array_filter(), ils ont juste une syntaxe plus verbeuse.

array_intersect() est également très facile à étendre (inclure des valeurs "qualificatives" supplémentaires) en ajoutant plus de valeurs au 2ème tableau de paramètres.

1
mickmackusa
  foreach ($aray as $key => $value) {
    if (2 != $value) {
      unset($array($key));
    }
  }

  echo 'Items in array:' . count($array);
0
Goran Jurić