La fonction de rappel array_filter()
ne transmet que les valeurs du tableau, pas les clés.
Si j'ai:
$my_array = array("foo" => 1, "hello" => "world");
$allowed = array("foo", "bar");
Quelle est la meilleure façon de supprimer toutes les clés $my_array
qui ne sont pas dans le $allowed
tableau?
Sortie désirée:
$my_array = array("foo" => 1);
$b = ['foo' => $a['foo'], 'bar' => $a['bar']]
Cela se traduira$b['bar']
soitnull
.Réponses:
PHP 5.6 introduit un troisième paramètre à
array_filter()
,flag
que vous pouvez définir pourARRAY_FILTER_USE_KEY
à filtrer par clé au lieu de la valeur:De toute évidence, ce n'est pas aussi élégant que cela
array_intersect_key($my_array, array_flip($allowed))
, mais cela offre la flexibilité supplémentaire d'effectuer un test arbitraire contre la clé, par exemple,$allowed
pourrait contenir des modèles d'expression régulière au lieu de chaînes simples.Vous pouvez également utiliser
ARRAY_FILTER_USE_BOTH
pour que la valeur et la clé soient transmises à votre fonction de filtrage. Voici un exemple artificiel basé sur le premier, mais notez que je ne recommanderais pas de coder les règles de filtrage de$allowed
cette manière:la source
array_intersect
Avec
array_intersect_key
etarray_flip
:la source
array_flip
? Définissez simplement les$allowed
touches avec:allowed = array ( 'foo' => 1, 'bar' => 1 );
J'avais besoin de faire de même, mais avec un plus complexe
array_filter
sur les touches.Voici comment je l'ai fait, en utilisant une méthode similaire.
Cela produit le résultat:
la source
Voici une solution plus flexible utilisant une fermeture:
Les sorties:
Ainsi, dans la fonction, vous pouvez effectuer d'autres tests spécifiques.
la source
Si vous recherchez une méthode pour filtrer un tableau par une chaîne apparaissant dans les clés, vous pouvez utiliser:
Le résultat de
print_r($mResult)
estUne adaptation de cette réponse qui prend en charge les expressions régulières
Production
la source
stristr
dans le "travail" de la fonction fait des suppositions pour l'utilisateur final. Il serait peut-être préférable de permettre à l'utilisateur de passer une expression régulière; cela leur donnerait plus de flexibilité sur certaines choses comme les ancres, les limites de mots et la casse, etc.Comment obtenir la clé actuelle d'un tableau lors de l'utilisation
array_filter
Quelle que soit la façon dont j'aime la solution de Vincent pour le problème de Maček, elle ne l'utilise pas réellement
array_filter
. Si vous êtes venu ici d'un moteur de recherche, vous cherchez peut-être quelque chose comme ça ( PHP> = 5.3 ):Il transmet le tableau que vous filtrez comme référence au rappel. Comme il
array_filter
n'est pas conventionnel d'itérer sur le tableau en augmentant son pointeur interne public, vous devez le faire avancer vous-même.Ce qui est important ici, c'est que vous devez vous assurer que votre baie est réinitialisée, sinon vous pourriez commencer en plein milieu.
En PHP> = 5.4, vous pourriez rendre le rappel encore plus court:
la source
Voici une alternative moins flexible en utilisant unset () :
Le résultat d'
print_r($array)
être:Cela ne s'applique pas si vous souhaitez conserver les valeurs filtrées pour une utilisation ultérieure, mais plus ordonné, si vous êtes certain de ne pas le faire.
la source
unset()
. Aucun avertissement n'est émis si la clé n'existe pas.Depuis PHP 5.6, vous pouvez utiliser le
ARRAY_FILTER_USE_KEY
drapeau dansarray_filter
:Sinon, vous pouvez utiliser cette fonction ( de TestDummy ):
Et voici une version augmentée de la mienne, qui accepte un rappel ou directement les touches:
Enfin, vous pouvez également utiliser un simple
foreach
:la source
Peut-être un excès si vous n'en avez besoin qu'une seule fois, mais vous pouvez utiliser la bibliothèque YaLinqo * pour filtrer les collections (et effectuer d'autres transformations). Cette bibliothèque permet d'exécuter des requêtes de type SQL sur des objets avec une syntaxe fluide. Sa
where
fonction accepte un calback avec deux arguments: une valeur et une clé. Par exemple:(La
where
fonction renvoie un itérateur, donc si vous avez seulement besoin de répéterforeach
une fois la séquence résultante, elle->toArray()
peut être supprimée.)* développé par mes soins
la source
fonction de filtre de tableau de php:
$ array - C'est le tableau d'entrée
$ callback_function - La fonction de rappel à utiliser , Si la fonction de rappel renvoie true , la valeur actuelle du tableau est retournée dans le tableau de résultat.
$ flag - C'est un paramètre facultatif , il déterminera quels arguments sont envoyés à la fonction de rappel. Si ce paramètre est vide, la fonction de rappel prendra comme argument les valeurs du tableau. Si vous souhaitez envoyer la clé du tableau comme argument, utilisez $ flag comme ARRAY_FILTER_USE_KEY . Si vous souhaitez envoyer les clés et les valeurs, vous devez utiliser $ flag comme ARRAY_FILTER_USE_BOTH .
Par exemple: considérons un tableau simple
Si vous souhaitez filtrer le tableau en fonction de la clé du tableau , nous devons utiliser ARRAY_FILTER_USE_KEY comme troisième paramètre de la fonction tableau array_filter.
Si vous souhaitez filtrer le tableau en fonction de la clé du tableau et de la valeur du tableau , nous devons utiliser ARRAY_FILTER_USE_BOTH comme troisième paramètre de la fonction de tableau array_filter.
Exemples de fonctions de rappel:
Il produira
la source
Avec cette fonction, vous pouvez filtrer un tableau multidimensionnel
la source
la source
Solution naïve et laide (mais qui semble être plus rapide)?
Seulement essayé en php 7.3.11 mais une boucle laide semble s'exécuter dans environ un tiers du temps. Des résultats similaires sur un tableau avec quelques centaines de clés. Micro-optimisation, probablement pas utile en RW, mais qui l'a trouvée surprenante et intéressante:
la source
la source