Filtre de tableau de PHP, comment obtenir la clé dans la callback?

array_filter-filtres éléments D'un tableau utilisant une fonction de rappel

array array_filter ( array $input [, la fonction de rappel de dollars rappel ] )

rappel obtenir la clé de l'ensemble de la valeur et comment?

12
demandé sur K-Gun 2011-10-09 01:38:36

5 réponses

à partir de la documentation: PHP 5.6.0 ajout de paramètres optionnels de drapeau et de constantes ARRAY_FILTER_USE_KEY et ARRAY_FILTER_USE_BOTH

http://php.net/manual/en/function.array-filter.php

10
répondu hosseio 2015-02-03 20:27:11

dans un commentaire précédent, vous avez souligné que vous êtes à la recherche de quelque chose comme ceci:

foreach ($t as $k => $v)
    if (!array_key_exists($k, $valid))
        unset($t[$k])

donc en fait pour supprimer toutes les valeurs du tableau $t qui n'ont pas de clé dans la gamme $valid.

la fonction PHP pour cela s'appelle array_intersect_key. L'intersection est égale à la filtrés résultat:

$filtered = array_intersect_key($t, $valid);
7
répondu hakre 2012-12-13 02:54:09
array_filter accédez à la clé de l'élément, et il n'y a pas de fonction similaire qui fasse ce que vous voulez.

Toutefois, vous pouvez écrire votre propre fonction pour cela, comme celle ci-dessous:

function arrayfilter(array $array, callable $callback = null) {
    if ($callback == null) {
        $callback = function($key, $val) {
            return (bool) $val;
        };
    }
    $return = array();
    foreach ($array as $key => $val) {
        if ($callback($key, $val)) {
            $return[$key] = $val;
        }
    }
    return $return;
}

$test_array = array('foo', 'a' => 'the a', 'b' => 'the b', 11 => 1101, '', null, false, 0);

$array = arrayfilter($test_array, function($key, $val) {
   return is_string($key);
});
print_r($array);
/*
Array
(
    [a] => the a
    [b] => the b
)
*/

$array = arrayfilter($test_array);
print_r($array);
/*
Array
(
    [0] => foo
    [a] => the a
    [b] => the b
    [11] => 1101
)
*/
3
répondu K-Gun 2014-04-18 17:00:17

vous pouvez utiliser la fonction array_walk comme indiqué ici (3ème réponse vers le bas):est-il possible si callback dans le paramètre de réception array_filter?

0
répondu jondbaker 2017-05-23 12:18:24

Je n'ai pas aimé les autres options suggérées ici, si quelqu'un d'autre est à la recherche de cette fonctionnalité, voici une implémentation rapide:

function array_filter_keys($a, $c){
    $i=array_filter(array_keys($a), $c);
    return array_intersect_key($a, array_flip($i));
}

le résultat de cette fonction est exactement ce à quoi elle ressemble, elle renvoie un tableau filtré par une fonction de rappel qui reçoit les clés plutôt que les valeurs.

modifier: Il s'agit plus d'un avertissement, après avoir lu certains des autres commentaires, je me rends compte que L'OP est en fait juste à la recherche de array_intersect comme l'a fait remarquer hakre. Je vais laisser cette réponse ici cependant puisque la question OPs n'indique pas clairement ce besoin et cette page apparaît dans google pour array_filter_keys

0
répondu Trey 2015-02-03 15:17:43