web-dev-qa-db-fra.com

php - récupère l'index numérique d'un tableau associatif

J'ai un tableau associatif et je dois trouver la position numérique d'une clé . Je pourrais parcourir le tableau manuellement pour le trouver, mais existe-t-il un meilleur moyen de construire PHP?

$a = array(
  'blue'   => 'Nice',
  'car'    => 'fast',
  'number' => 'none'
);

// echo (find numeric index of $a['car']); // output: 1
139
n00b
echo array_search("car",array_keys($a));
241
Fosco
$blue_keys = array_search("blue", array_keys($a));

http://php.net/manual/en/function.array-keys.php

34
quantumSoup
function arrayValuePosition($value, $array)
{
    return array_search($value, array_keys($array));
}
2
Andrey Vorobyev

  $a = array(
      'blue' => 'Nice',
      'car' => 'fast',
      'number' => 'none'
  );  
var_dump(array_search('car', array_keys($a)));
var_dump(array_search('blue', array_keys($a)));
var_dump(array_search('number', array_keys($a)));
2
Asterión

Bien que la réponse de Fosco ne soit pas fausse, il y a un cas à considérer avec celui-ci: des tableaux mélangés. Imaginez que j'ai un tableau comme celui-ci:

$a = array(
  "Nice",
  "car" => "fast",
  "none"
);

Maintenant, PHP autorise ce type de syntaxe, mais il y a un problème: si je lance le code de Fosco, je reçois 0 ce qui est faux pour moi, mais pourquoi cela se produit-il?
Parce que lors de la comparaison entre chaînes et entiers PHP convertit les chaînes en entiers (et c'est un peu stupide à mon avis), donc lorsque array_search() recherche l'index, il s'arrête au premier parce qu'apparemment ("car" == 0) est vrai .
Régler array_search() sur le mode strict ne résoudra pas le problème car array_search("0", array_keys($a)) renverrait false même s'il existe un élément d'indice 0.
Ainsi, ma solution convertit simplement tous les index de array_keys() en chaînes, puis les compare correctement: 

echo array_search("car", array_map("strval", array_keys($a)));

Imprime 1, ce qui est correct.

MODIFIER:
Comme Shaun l’a souligné dans le commentaire ci-dessous, la même chose s’applique à la valeur d’index, si vous recherchez un index int comme celui-ci:

$a = array(
  "foo" => "bar",
  "Nice",
  "car" => "fast",
  "none"
);
$ind = 0;
echo array_search($ind, array_map("strval", array_keys($a)));

Vous obtiendrez toujours 0, ce qui est faux. La solution serait donc de convertir l'index (si vous utilisez une variable) en une chaîne comme celle-ci:

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));
1
Xriuk

une solution que j'ai trouvée ... probablement assez inefficace en comparaison de la solution de Fosco:

 protected function getFirstPosition(array$array, $content, $key = true) {

  $index = 0;
  if ($key) {
   foreach ($array as $key => $value) {
    if ($key == $content) {
     return $index;
    }
    $index++;
   }
  } else {
   foreach ($array as $key => $value) {
    if ($value == $content) {
     return $index;
    }
    $index++;
   }
  }
 }
0
n00b

Toutes les solutions basées sur array_keys ne fonctionnent pas pour les tableaux mélangés. La solution est simple:

echo array_search($needle,array_keys($haystack), true);

De php.net:Si le troisième paramètre strict est défini sur TRUE, la fonction array_search () recherchera des éléments identiques dans la botte de foin. Cela signifie qu'il effectuera également une comparaison de type stricte de l'aiguille dans la botte de foin, et que les objets doivent avoir la même instance. 

0
MrBlc