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 ?

9voto

iautomation Points 840

Les solutions ci-dessus sont intelligentes, mais très lentes. Une simple boucle foreach avec isset est plus de deux fois plus rapide que la solution array_intersect_key solution.

function array_keys_exist($keys, $array){
    foreach($keys as $key){
        if(!array_key_exists($key, $array))return false;
    }
    return true;
}

(344ms vs 768ms pour 1000000 itérations)

3voto

Sven Points 14241

Si vous avez quelque chose comme ça :

$stuff = array();
$stuff[0] = array('story' => 'A story', 'message' => 'in a bottle');
$stuff[1] = array('story' => 'Foo');

Vous pourriez simplement count() :

foreach ($stuff as $value) {
  if (count($value) == 2) {
    // story and message
  } else {
    // only story
  }
}

Cela ne fonctionne que si vous êtes certain de n'avoir QUE ces clés de tableau, et rien d'autre.

L'utilisation de array_key_exists() ne permet de vérifier qu'une clé à la fois, vous devrez donc vérifier les deux séparément :

foreach ($stuff as $value) {
  if (array_key_exists('story', $value) && array_key_exists('message', $value) {
    // story and message
  } else {
    // either one or both keys missing
  }
}

array_key_exists() retourne vrai si la clé est présente dans le tableau, mais c'est une vraie fonction et beaucoup à taper. La construction du langage isset() fera presque la même chose, sauf si la valeur testée est NULL :

foreach ($stuff as $value) {
  if (isset($value['story']) && isset($value['message']) {
    // story and message
  } else {
    // either one or both keys missing
  }
}

De plus, isset permet de vérifier plusieurs variables à la fois :

foreach ($stuff as $value) {
  if (isset($value['story'], $value['message']) {
    // story and message
  } else {
    // either one or both keys missing
  }
}

Maintenant, pour optimiser le test pour les éléments qui sont définis, il vaut mieux utiliser ce "si" :

foreach ($stuff as $value) {
  if (isset($value['story']) {
    if (isset($value['message']) {
      // story and message
    } else {
      // only story
    }
  } else {
    // No story - but message not checked
  }
}

3voto

David Dutkovsky Points 31

Qu'en est-il de ceci :

isset($arr['key1'], $arr['key2']) 

ne renvoie vrai que si les deux ne sont pas nuls

si is null, la clé n'est pas dans le tableau

3voto

Steve Points 1386

J'utilise quelque chose comme ça assez souvent

$wantedKeys = ['story', 'message'];
$hasWantedKeys = count(array_intersect(array_keys($source), $wantedKeys)) > 0

ou pour trouver les valeurs des clés recherchées

$wantedValues = array_intersect_key($source, array_fill_keys($wantedKeys, 1))

2voto

valmayaki Points 171

Essayez ceci

$required=['a','b'];$data=['a'=>1,'b'=>2];
if(count(array_intersect($required,array_keys($data))>0){
    //a key or all keys in required exist in data
 }else{
    //no keys found
  }

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