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


154

J'ai un tableau associatif et j'ai besoin de trouver la position numérique d'une clé. Je pourrais parcourir le tableau manuellement pour le trouver, mais y a-t-il un meilleur moyen d'intégrer PHP?

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

// echo (find numeric index of $a['car']); // output: 1

Réponses:


273
echo array_search("car",array_keys($a));

5
PHP garantit-il l'ordre d'un tableau associatif?
Kevin Burke

7
@KevinBurke Il ne va pas le réorganiser à moins que vous n'utilisiez une fonction de tri. Vous ne savez pas quel type de garantie vous recherchez, mais ce n'est pas comme le modèle JavaScript où il n'y a pas d'ordre statique dans les tableaux associatifs.
Fosco

6
Les index donnés par "array_keys" ne correspondront pas nécessairement à l'index du tableau d'origine. Par exemple, si vous avez modifié le tableau en utilisant «unset» ou un certain nombre d'autres fonctions, il y aura un espace laissé dans l'index du tableau d'origine, mais array_keys produira un nouveau tableau.
SEoF

4
Cela NE FONCTIONNE PAS si le tableau associatif est mélangé, car array("val1", "val2", "car" => "val3")il produira 0, ce qui est faux ...
Xriuk

En quoi est-ce différent de la réponse
Mystical


2

  $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
function arrayValuePosition($value, $array)
{
    return array_search($value, array_keys($array));
}

2

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

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

Maintenant, PHP permet ce genre de syntaxe mais il a un problème: si j'exécute le code de Fosco, j'obtiens 0 ce qui est faux pour moi, mais pourquoi cela se produit?
Parce que lorsque vous faites des comparaisons entre des chaînes et des entiers, PHP convertit les chaînes en entiers (et c'est un peu stupide à mon avis), donc lorsque vous array_search()recherchez l'index, il s'arrête au premier parce qu'apparemment, ("car" == 0) c'est vrai .
Le réglage array_search()en mode strict ne résoudra pas le problème car array_search("0", array_keys($a))cela renverrait false même si un élément d'index 0 existe.
Donc, 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.

EDIT:
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, donc la solution serait 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
Lorsque vous passez une variable, vous devez également la convertir en chaîne, car la transmission de zéro à un tableau associatif aurait le même effet négatif. Par exemple: var_dump(array_search(0, array_map("strval", array_keys($a))));produira toujours int (0), plutôt que bool (false).
Shaun Cockerill

@ShaunCockerill à droite! J'ai mis à jour ma réponse, merci de l'avoir signalé!
Xriuk

0

une solution que j'ai trouvée ... probablement assez inefficace en comparaison avec 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++;
   }
  }
 }

2
Ouais, PHP a des milliers de fonctions intégrées pour une raison. Celles-ci sont généralement beaucoup plus rapides que la logique équivalente écrite à long terme dans le code PHP.
Bill Karwin

3
C'est probablement plus rapide que array_search, qui effectue un tri en premier et donc douloureusement lent.
Alasdair

Ah, mais le code intégré est précompilé, et la recherche sera très probablement une recherche binaire (en supposant qu'elle trie d'abord les éléments).
SEoF

0

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

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

Depuis 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 les objets doivent être la même instance.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.