428 votes

PHP: Comment utiliser array_filter() pour filtrer les clés du tableau?

La fonction de rappel en array_filter() seulement passe dans le tableau de valeurs, 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 en $my_array qui ne sont pas dans l' $allowed tableau?

Sortie désirée:

$my_array = array("foo" => 1);

501voto

Vincent Savard Points 12215

Avec array_intersect_key et array_flip:

var_dump(array_intersect_key($my_array, array_flip($allowed)));

array(1) {
  ["foo"]=>
  int(1)
}

array_intersect_key est assez explicites et de array_flip flips les touches avec les valeurs.

437voto

Richard Turner Points 3035

Si vous êtes à l'aide de PHP 5.6, vous pouvez maintenant définir un indicateur de filtre sur clé du tableau à la place de tableau de la valeur:

$allowed  = ['foo', 'bar'];
$filtered = array_filter(
    $my_array,
    function ($key) use ($allowed) {
        return in_array($key, $allowed);
    },
    ARRAY_FILTER_USE_KEY
);

Clairement, ce n'est pas élégant, array_intersect_key($my_array, array_flip($allowed)), mais elle offre une plus grande flexibilité de l'exécution de l'arbitraire d'un test à l'encontre de la clé, par exemple, $allowed pourraient contenir des modèles regex au lieu de la plaine des chaînes de caractères.

44voto

Christopher Points 878

J'avais besoin de le faire, mais avec de plus en plus complexes, array_filter sur les touches.

Voici comment je l'ai fait, en utilisant une méthode similaire.

// Filter out array elements with keys shorter than 4 characters
$a = array(
  0      => "val 0", 
  "one"  => "val one", 
  "two"  => "val two", 
  "three"=> "val three", 
  "four" => "val four", 
  "five" => "val five", 
  "6"    => "val 6"
); 

$f = array_filter(array_keys($a), function ($k){ return strlen($k)>=4; }); 
$b = array_intersect_key($a, array_flip($f));
print_r($b);

Cette fonction génère le résultat:

Array
(
    [three] => val three
    [four] => val four
    [five] => val five
)

8voto

COil Points 295

Voici une solution plus flexible à l'aide d'une fermeture à:

$my_array = array("foo" => 1, "hello" => "world");
$allowed = array("foo", "bar");
$result = array_flip(array_filter(array_flip($my_array), function ($key) use ($allowed)
{
    return in_array($key, $allowed);
}));
var_dump($result);

Sorties:

array(1) {
  'foo' =>
  int(1)
}

Ainsi, dans la fonction, vous pouvez faire d'autres tests spécifiques.

4voto

lserni Points 19089

J'ai eu besoin d'un array_filter_keys() identique dans sa structure à l' array_filter().

C'est ce que je suis venu avec. Il nécessite PHP 5.3+, sinon des valeurs intermédiaires doivent être enregistrées dans des variables qui leur sont propres.

/**
 * Filters elements of an array using a callback function operating on keys.
 * @param array $input           The array to iterate overarray to be filtered
 * @param callable $callback     The callback function to use (mandatory)
 *                               returns boolean TRUE/FALSE judgment on keys:
 *                                  function callback($keyName);
 * @return the filtered array, whose keys satisfy callback().
 */
function arrayFilterKeys($input, $callback) {
    return array_intersect_key(
        $input,
        array_flip(
            array_filter(
                array_keys($input),
                $callback
            )
        )
    );
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X