Qual é a melhor maneira de determinar a primeira chave em uma matriz possivelmente associativa? Meu primeiro pensamento foi foreach da matriz e imediatamente quebrá-la, assim:
foreach ($an_array as $key => $val) break;
Assim, ter a chave $ contém a primeira chave, mas isso parece ineficiente. Alguém tem uma solução melhor?
foreach
é semanticamente errado.each($arr)['key']
oueach($arr)[0]
funcionaria.0.0107
0.0217
Respostas:
Atualização de 2019
A partir do PHP 7.3 , existe uma nova função
array_key_first()
interna chamada que recuperará a primeira chave da matriz fornecida sem redefinir o ponteiro interno. Confira a documentação para mais informações.Você pode usar
reset
ekey
:É essencialmente o mesmo que o seu código inicial, mas com um pouco menos de sobrecarga e é mais óbvio o que está acontecendo.
Lembre-se de ligar
reset
, ou você pode obter qualquer uma das chaves da matriz. Você também pode usar emend
vez dereset
para obter a última chave.Se você queria que a chave obtivesse o primeiro valor,
reset
na verdade , ele a retornaria:No entanto, há um caso especial a ser observado (verifique primeiro o comprimento da matriz):
fonte
reset()
também retorna o primeiro elemento (valor, não chave) de qualquer matriz, o que também pode ser útil.reset()
dizendoDon't use
reset () `para obter o primeiro valor de uma matriz associativa. Funciona muito bem para matrizes verdadeiras, mas funciona inesperadamente em objetos Iterator. bugs.php.net/bug.php?id=38478 `Isso ainda é verdade? Estou confusoarray
objetos, mas objetos personalizados (que não são matrizes reais). Eu acho que eles confundiram a diferença nas estruturas de dados, mas basicamentereset
retornam o valor da primeira "chave", que para objetos seria$prop
o exemplo dado no relatório "bug", mas para uma matriz a primeira chave. Portanto, não se preocupe, desde que você use matrizes reais (criadas comarray(…)
), você não terá problemas.next
,reset
,end
ou loop através da matriz), você não vai obter o valor esperado quando você chamarkey
. Portanto, sim, sempre liguereset
antes de usarkey
para ter certeza de que consegue o que deseja.array_keys
retorna uma matriz de chaves. Pegue a primeira entrada. Como alternativa, você pode chamarreset
a matriz e, posteriormentekey
. A última abordagem é provavelmente um pouco mais rápida (Thoug, eu não a testei), mas tem o efeito colateral de redefinir o ponteiro interno.fonte
foreach
+break
ereset
+key
na verdade. Mas o primeiro parece um pouco estranho, então, por questões estilísticas, eu preferiria o segundo.foreach
que não cria uma cópia interna para ele, mas apenas itera um ponteiro , semelhante ao uso do mais baixo nívelnext
,current
etcCuriosamente, o loop foreach é realmente a maneira mais eficiente de fazer isso.
Como o PO perguntou especificamente sobre eficiência, deve-se ressaltar que todas as respostas atuais são de fato muito menos eficientes do que uma pesquisa.
Fiz uma referência nisso com o php 5.4, e o método de reset / key pointer (resposta aceita) parece ser cerca de 7 vezes mais lento que um foreach. Outras abordagens manipulando toda a matriz (array_keys, array_flip) são obviamente ainda mais lentas que isso e se tornam muito piores ao trabalhar com uma matriz grande.
O Foreach não é ineficiente, fique à vontade para usá-lo!
Editar 03-03-2015:
Scripts de benchmark foram solicitados, eu não tenho os originais, mas fiz alguns novos testes. Dessa vez, encontrei o foreach apenas duas vezes mais rápido que a tecla reset /. Usei uma matriz de 100 chaves e executei cada método um milhão de vezes para obter alguma diferença perceptível, aqui está o código da referência simples:
No meu php 5.5 esta saída:
tecla reset + http://3v4l.org/b4DrN/perf#tabs
foreach http://3v4l.org/gRoGD/perf#tabs
fonte
foreach
nunca copia a matriz, a menos que você a modifique diretamente dentro do loop foreach. No php5, a estrutura do array pode ser copiada em alguns casos (quando seu refcount> 1) e você está certo, pode haver uma influência significativa lá. Felizmente, não há nada com que se preocupar no php7, onde esse problema foi resolvido. Aqui está uma ótima leitura sobre como o foreach funciona sob o capô agora e como funcionou no passado.key($an_array)
vai te dar a primeira chaveeditar por Blixt: você deve ligar
reset($array);
anteskey($an_array)
para redefinir o ponteiro para o início da matriz.fonte
Você poderia tentar
fonte
Para 2018 +
A partir do PHP 7.3, existe uma
array_key_first()
função que consegue exatamente isso:A documentação está disponível aqui . 😉
fonte
fonte
Se a eficiência não é tão importante para você, você pode usar
array_keys($yourArray)[0]
no PHP 5.4 (e superior).Exemplos:
A vantagem sobre a solução:
é que você pode passar
array_keys($arr)[0]
como um parâmetro de função (iedoSomething(array_keys($arr)[0], $otherParameter)
).HTH
fonte
array_keys($arr)[0]
sintaxe é válida?array dereferencing
. Veja, por exemplo: schlueters.de/blog/archives/…Por favor, encontre o seguinte:
Exemplo de trabalho:
fonte
fonte
max()
dose @jurgemaister não retorna a primeira chave de uma matriz assoc. max valor máximo retorno de uma lista ou um array itensIsso também pode ser uma solução:
Eu testei e funciona.
Código de trabalho .
fonte
Para aprimorar a solução do Webmut , adicionei a seguinte solução:
A saída para mim no PHP 7.1 é:
Se eu fizer isso para uma matriz de tamanho 10000, os resultados se tornarão
O método array_keys atinge o tempo limite em 30 segundos (com apenas 1000 elementos, o tempo para o resto foi praticamente o mesmo, mas o método array_keys teve cerca de 7,5 segundos).
fonte
fonte
A melhor maneira que funcionou para mim foi
array_keys
obtém uma matriz de chaves da matriz inicial e depoisarray_shift
corta o primeiro valor do elemento. Você precisará do PHP 5.4+ para isso.fonte
Esta é a maneira mais fácil que eu já encontrei. Rápido e apenas duas linhas de código :-D
fonte
php73:
http://php.net/manual/en/function.array-key-first.php
fonte
Uma linha:
fonte
Hoje tive que procurar a primeira chave da minha matriz retornada por uma solicitação POST. (E anote o número da identificação do formulário, etc.)
Bem, eu encontrei o seguinte: Retorne a primeira chave do array associativo em PHP
http://php.net/key
Eu fiz isso e funcionou.
Talvez seja eco 15min de outro cara. CYA.
fonte
Você pode jogar com sua matriz
Para obter o primeiro elemento da matriz, você pode usar
current
e, para o último elemento, você pode usarend
Editar
Por uma questão de não obter mais votos negativos para a resposta, você pode converter sua chave em valor usando
array_keys
e usando como mostrado acima.fonte