Étonnamment array_keys_exist
n'existe pas ? ! En attendant, cela laisse un peu de place pour trouver une expression à une seule ligne pour cette tâche commune. Je pense à un shell script ou un autre petit programme.
Remarque : chacune des solutions suivantes utilise des données concises. […]
La syntaxe de déclaration des tableaux est disponible en php 5.4+.
if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
// all keys found
} else {
// not all
}
(coup de chapeau à Kim Stacks )
Cette approche est la plus brève que j'ai trouvée. array_diff()
renvoie un tableau des éléments présents dans l'argument 1 no présents dans l'argument2. Par conséquent, un tableau vide indique que toutes les clés ont été trouvées. En php 5.5, vous pouviez simplifier 0 === count(…)
pour être simplement empty(…)
.
if (0 === count(array_reduce(array_keys($source),
function($in, $key){ unset($in[array_search($key, $in)]); return $in; },
['story', 'message', '…'])))
{
// all keys found
} else {
// not all
}
Plus difficile à lire, facile à changer. array_reduce()
utilise un callback pour itérer sur un tableau afin d'obtenir une valeur. En alimentant les clés qui nous intéressent avec la fonction $initial
valeur de $in
puis en supprimant les clés trouvées dans la source, on peut s'attendre à obtenir 0 élément si toutes les clés ont été trouvées.
La construction est facile à modifier puisque les clés qui nous intéressent s'adaptent bien à la ligne de fond.
if (2 === count(array_filter(array_keys($source), function($key) {
return in_array($key, ['story', 'message']); }
)))
{
// all keys found
} else {
// not all
}
Plus simple à écrire que le array_reduce
mais un peu plus délicat à éditer. array_filter
est également un callback itératif qui vous permet de créer un tableau filtré en retournant true (copier l'élément dans le nouveau tableau) ou false (ne pas copier) dans le callback. Le problème est que vous devez modifier 2
au nombre d'articles que vous attendez.
Cela peut être rendu plus durable, mais cela frise une lisibilité absurde :
$find = ['story', 'message'];
if (count($find) === count(array_filter(array_keys($source), function($key) use ($find) { return in_array($key, $find); })))
{
// all keys found
} else {
// not all
}