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?
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
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);
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
)
*/
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?
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