105 votes

Comment vérifier si plusieurs clés de tableau existent

J'ai une variété de tableaux qui vont contenir soit

story & message

ou simplement

story

Comment vérifier qu'un tableau contient à la fois une histoire et un message ? array_key_exists() ne recherche que cette seule clé dans le tableau.

Y a-t-il un moyen de le faire ?

220voto

Erfan Points 606

Voici une solution évolutive, même si vous souhaitez vérifier un grand nombre de clés :

<?php

// The values in this arrays contains the names of the indexes (keys) 
// that should exist in the data array
$required = array('key1', 'key2', 'key3');

$data = array(
    'key1' => 10,
    'key2' => 20,
    'key3' => 30,
    'key4' => 40,
);

if (count(array_intersect_key(array_flip($required), $data)) === count($required)) {
    // All required keys exist!
}

92voto

alex Points 186293

Si vous n'avez que 2 clés à vérifier (comme dans la question originale), il est probablement assez facile de simplement appeler array_key_exists() deux fois pour vérifier si les clés existent.

if (array_key_exists("story", $arr) && array_key_exists("message", $arr)) {
    // Both keys exist.
}

Cependant, il est évident que cette méthode n'est pas adaptée à un grand nombre de touches. Dans cette situation, une fonction personnalisée serait utile.

function array_keys_exists(array $keys, array $arr) {
   return !array_diff_key(array_flip($keys), $arr);
}

35voto

Mark Fox Points 1665

É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+.

tableau_diff + tableau_clés

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(…) .

tableau_réduit + non activé

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.

filtre_tableau & dans_réseau

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
}

16voto

Vasily Points 1718

Une autre solution possible :

if (!array_diff(['story', 'message'], array_keys($array))) {
    // OK: all the keys are in $array
} else {
   // FAIL: some keys are not
}

15voto

Petr Cibulka Points 314

Il me semble que la méthode la plus simple et de loin serait la suivante :

$required = array('a','b','c','d');

$values = array(
    'a' => '1',
    'b' => '2'
);

$missing = array_diff_key(array_flip($required), $values);

Imprimés :

Array(
    [c] => 2
    [d] => 3
)

Cela permet également de vérifier quelles clés manquent exactement. Cela peut être utile pour la gestion des erreurs.

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