Étonnamment array_keys_exist
n'existe pas?! En attendant, cela laisse un peu d'espace pour trouver une expression sur une seule ligne pour cette tâche courante. Je pense à un script shell ou à un autre petit programme.
Remarque: chacune des solutions suivantes utilise la […]
syntaxe de déclaration de tableau concise disponible dans php 5.4+
if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
} else {
}
(pointe du chapeau à Kim Stacks )
Cette approche est la plus brève que j'ai trouvée. array_diff()
renvoie un tableau d'éléments présents dans l'argument 1 non 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 pourriez 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', '…'])))
{
} else {
}
Plus difficile à lire, facile à changer. array_reduce()
utilise un rappel pour parcourir un tableau pour arriver à une valeur. En alimentant les clés, nous nous intéressons à la $initial
valeur de $in
, puis en supprimant les clés trouvées dans la source, nous pouvons nous attendre à terminer avec 0 élément si toutes les clés ont été trouvées.
La construction est facile à modifier car les clés qui nous intéressent s'adaptent bien à la ligne du bas.
if (2 === count(array_filter(array_keys($source), function($key) {
return in_array($key, ['story', 'message']); }
)))
{
} else {
}
Plus simple à écrire que la array_reduce
solution mais légèrement plus compliqué à modifier. array_filter
est également un rappel itératif qui vous permet de créer un tableau filtré en retournant true (copier l'élément dans un nouveau tableau) ou false (ne pas copier) dans le rappel. Le gotchya est que vous devez changer 2
le nombre d'articles que vous attendez.
Cela peut être rendu plus durable mais à la limite de la lisibilité absurde:
$find = ['story', 'message'];
if (count($find) === count(array_filter(array_keys($source), function($key) use ($find) { return in_array($key, $find); })))
{
} else {
}