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
n00b
la source

Réponses:

273
echo array_search("car",array_keys($a));
Fosco
la source
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
35
$blue_keys = array_search("blue", array_keys($a));

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

quantumSoup
la source
8
+1 m'a sauvé 5 moments de recherche sur Google pour cette fonction que j'ai utilisée pour taper ce commentaire.
Aditya MP
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)));

Asterión
la source
2
function arrayValuePosition($value, $array)
{
    return array_search($value, array_keys($array));
}
Andrey Vorobyev
la source
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)));
Xriuk
la source
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++;
   }
  }
 }
n00b
la source
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.

MrBlc
la source