php - obtém índice numérico do array associativo

154

Eu tenho uma matriz associativa e preciso encontrar a posição numérica de uma tecla. Eu poderia percorrer manualmente a matriz para encontrá-lo, mas existe uma maneira melhor de incorporar o PHP?

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

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

Respostas:

273
echo array_search("car",array_keys($a));
Fosco
fonte
5
O PHP garante a ordem de uma matriz associativa?
Kevin Burke
7
@KevinBurke Não será reordená-lo, a menos que você use uma função de classificação. Não tenho certeza do tipo de garantia que você está procurando, mas não é como o modelo JavaScript, onde não há ordem estática para matrizes associativas.
Fosco
6
Os índices fornecidos por "array_keys" não coincidem necessariamente com o índice da matriz original. Por exemplo, se você alterou a matriz usando "unset" ou várias outras funções, haverá uma lacuna no índice da matriz original, mas as array_keys produzirão uma nova matriz.
Seof
4
Este trabalho não se a matriz associativa é mista, para array("val1", "val2", "car" => "val3")que irá produzir 0, o que é errado ...
Xriuk
Como isso é diferente da resposta
Mystical
35
$blue_keys = array_search("blue", array_keys($a));

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

quantumSoup
fonte
8
O +1 me salvou 5 momentos de pesquisa no google por essa função que eu usei para digitar este comentário.
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
fonte
2
function arrayValuePosition($value, $array)
{
    return array_search($value, array_keys($array));
}
Andrey Vorobyev
fonte
2

Embora a resposta de Fosco não esteja errada, há um caso a ser considerado com este: matrizes mistas. Imagine que eu tenho uma matriz como esta:

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

Agora, o PHP permite esse tipo de sintaxe, mas há um problema: se eu executo o código do Fosco, entendo o 0 que está errado para mim, mas por que isso acontece?
Porque, ao fazer comparações entre seqüências de caracteres e números inteiros, o PHP converte as seqüências em números inteiros (e isso é meio estúpido na minha opinião), então, quando array_search()o índice é pesquisado, ele pára no primeiro porque, aparentemente, ("car" == 0) é verdade .
Definir array_search()o modo estrito não resolverá o problema, pois array_search("0", array_keys($a))retornaria false, mesmo que exista um elemento com o índice 0.
Portanto, minha solução apenas converte todos os índices de array_keys()para strings e os compara corretamente:

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

Imprime 1, o que está correto.

EDIT:
Como Shaun apontou no comentário abaixo, o mesmo se aplica ao valor do índice, se você procurar um índice int como este:

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

Você sempre terá 0, o que está errado, então a solução seria converter o índice (se você usar uma variável) em uma string como esta:

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));
Xriuk
fonte
1
Ao passar uma variável, você também deve convertê-la como uma string, pois passar zero para uma matriz associativa teria o mesmo efeito negativo. Por exemplo: var_dump(array_search(0, array_map("strval", array_keys($a))));sempre produzirá int (0), em vez de bool (false).
Shaun Cockerill
@ShaunCockerill right! Atualizei minha resposta, obrigado por apontar isso!
Xriuk 21/03/19
0

uma solução que eu encontrei ... provavelmente bastante ineficiente em comparação com a solução 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
fonte
2
Sim, o PHP tem milhares de funções internas por um motivo. Eles geralmente são muito mais rápidos do que a lógica equivalente escrita no longo caminho no código PHP.
Bill Karwin
3
Provavelmente é mais rápido do que array_search, o que faz uma espécie primeiro e, portanto, dolorosamente lento.
Alasdair
Ah, mas o código interno é pré-compilado, e a pesquisa provavelmente será uma pesquisa binária (supondo que classifique os itens primeiro).
SEoF
0

Todas as soluções baseadas em array_keys não funcionam para matrizes mistas. A solução é simples:

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

Do php.net: Se o terceiro parâmetro strict for definido como TRUE, a função array_search () procurará elementos idênticos no palheiro. Isso significa que ele também fará uma comparação estrita do tipo da agulha no palheiro, e os objetos devem ter a mesma instância.

MrBlc
fonte