Question

J'ai un tableau comme ceci:

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 dont la valeur est égale à 2 et supprimer tous les éléments où la valeur est 2.

Donc, mon tableau de résultat attendu serait:

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

Remarque: je veux garder les clés du tableau original

.

Comment puis-je faire avec PHP? Tous les fonctions intégrées?

Était-ce utile?

La solution

$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";
}

Autres conseils

Vous avez en quelque sorte à boucle à travers votre réseau et de filtrer chaque élément par votre condition. Cela peut être fait avec différentes méthodes.

while / for / foreach procédé

Boucle dans votre tableau avec une boucle que vous voulez, peut-il être while, for ou foreach. Ensuite, il suffit de vérifier votre état et soit unset() les éléments si elles ne répondent pas votre état ou écrire les éléments qui répondent à la condition, dans un nouveau tableau.

Looping

//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
}

Condition

Il suffit de placer votre condition dans la boucle où le commentaire est //condition. La condition peut vérifier uniquement ce que vous voulez et vous pouvez soit unset() les éléments qui ne répondent pas à votre condition et réindexer le tableau avec array_filter() procédé

Une autre méthode consiste à utiliser la fonction de array_filter() intégré. Il fonctionne généralement à peu près la même chose que la méthode avec une simple boucle.

Vous avez juste besoin de revenir TRUE si vous voulez garder l'élément du tableau et FALSE si vous voulez laisser tomber l'élément hors 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() procédé

preg_grep() est similaire à array_filter() juste qu'il utilise uniquement l'expression régulière pour filtrer le tableau. Donc, vous pourriez ne pas être en mesure de tout faire avec elle, puisque vous ne pouvez utiliser une expression régulière comme filtre et vous ne pouvez filtrer par des valeurs ou un code plus par les touches.

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

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

Conditions communes

Il y a beaucoup de conditions communes pour filtrer un tableau dont tous peuvent être appliqués à la valeur et ou clé du tableau. Je vais énumérer quelques-uns d'entre eux 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

Vous pouvez itérer sur 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 -. Ils ne sont pas dupliqués

EDIT Je viens de remarquer, que vous avez réellement besoin que les 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;
    }
}

Cela devrait fonctionner, mais je ne suis pas sûr de savoir comment il est efficace que vous finirez probablement la copie d'un grand nombre de données.

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

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

Code: ( Demo )

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

Sortie:

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

Assurez-vous que vous déclarez le 2ème paramètre comme un tableau parce que c'est le type de valeur attendue.

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

array_intersect() est également très facile à étendre (inclure les valeurs « admissibles » supplémentaires) en ajoutant plus de valeurs au tableau 2 des paramètres.

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

  echo 'Items in array:' . count($array);

Je pourrais faire quelque chose comme:

$newarray = array();
foreach ($jsonarray as $testelement){
    if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top