109 votes

Obtenir l'index d'une certaine valeur dans un tableau en PHP

J'ai un tableau :

$list = array('string1', 'string2', 'string3');

Je veux obtenir l'indice pour une valeur donnée (c.-à-d. 1 pour string2 et 2 pour string3)

Tout ce que je veux c'est la position des chaînes dans le tableau

  • string1 vaut 0
  • string2 vaut 1
  • string3 vaut 2

Comment y parvenir ?

196voto

RaYell Points 26761

array_search est la façon de le faire.

array_search ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : mixed

De la part des docs :

$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;

Vous pouvez boucler le tableau manuellement et trouver l'index, mais pourquoi le faire quand il y a une fonction pour cela. Cette fonction renvoie toujours une clé et elle fonctionnera bien avec les tableaux associatifs et normaux.

21voto

ircmaxell Points 74865

Si vous ne faites que quelques-uns d'entre eux (et/ou que la taille du tableau est grande), alors vous étiez sur la bonne piste avec array_search :

$list = array('string1', 'string2', 'string3');
$k = array_search('string2', $list); //$k = 1;

Si vous voulez tout (ou beaucoup d'entre eux), une boucle vous sondera faire mieux :

foreach ($list as $key => $value) {
    echo $value . " in " . $key . ", ";
}
// Prints "string1 in 0, string2 in 1, string3 in 2, "

14voto

Bill Karwin Points 204877

D'autres personnes ont suggéré array_search() qui donne la clé de l'élément tableau où la valeur est trouvée. Vous pouvez vous assurer que les clés du tableau sont des entiers contigus en utilisant array_values() :

$list = array(0=>'string1', 'foo'=>'string2', 42=>'string3');
$index = array_search('string2', array_values($list));
print "$index\n";

// result: 1

Vous avez dit dans votre question que array_search() rien. Pouvez-vous expliquer pourquoi ? Qu'avez-vous essayé et comment cela n'a-t-il pas répondu à vos besoins ?

12voto

Brian Berneker Points 175

Le problème est que vous n'avez pas d'index numérique sur votre tableau.
L'utilisation de array_values() créera un tableau indexé à zéro que vous pourrez ensuite rechercher à l'aide de array_search() en contournant le besoin d'utiliser une boucle for.

$list = ['string1', 'string2', 'string3'];
$index = array_search('string2',array_values($list));

9voto

Michael Hurley Points 23

// ou compte tenu de la structure de votre tableau :

$array = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => ''),
);

// you could just

function findIndexOfKey($key_to_index,$array){
  return array_search($key_to_index,array_keys($array));
}

// exécuté

print "\r\n//-- Method 1 --//\r\n";
print '#index of: string1 = '.findIndexofKey('string1',$array)."\r\n";
print '#index of: string2 = '.findIndexofKey('string2',$array)."\r\n";
print '#index of: string3 = '.findIndexofKey('string3',$array)."\r\n";

// alternativement

print "\r\n//-- Method 2 --//\r\n";
print '#index of: string1 = '.array_search('string1',array_keys($array))."\r\n";
print '#index of: string2 = '.array_search('string2',array_keys($array))."\r\n";
print '#index of: string3 = '.array_search('string3',array_keys($array))."\r\n";

// récursivement

print "\r\n//-- Method 3 --//\r\n";
foreach(array_keys($array) as $key => $value){
  print '#index of: '.$value.' = '.$key."\r\n";
}

// sorties

//-- Method 1 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 2 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 3 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

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