Eu tenho uma matriz:
array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
Eu gostaria de obter o primeiro elemento dessa matriz. Resultado esperado: string apple
Um requisito: não pode ser feito com passagem por referência , portantoarray_shift
não é uma boa solução.
Como posso fazer isso?
&$array
como parâmetros.Respostas:
Resposta original, mas cara (O (n)):
Em O (1):
Outros casos de uso, etc ...
Se a modificação (no sentido de redefinir ponteiros de matriz)
$array
não for um problema, você poderá usar:Teoricamente, isso deve ser mais eficiente, se uma matriz "cópia" for necessária:
Com o PHP 5.4+ (mas pode causar um erro de índice se vazio):
fonte
list()
ereset()
são soluções muito melhores para minha opinião.Como Mike apontou (a maneira mais fácil possível):
Se você deseja obter a chave: (execute-a após a redefinição)
Da documentação do PHP :
Descrição:
fonte
foreach
com a matriz de assuntos, você estragará tudo.foreach
copiará a matriz pela qual ela está fazendo o loop.key($arr)
e você obterá '4' (adicionado em resposta)reset()
. 2) Não, foreach NÃO cria uma cópia de uma matriz !!! Ele apenas cria seu próprio ponteiro (nem mesmo uma cópia de um já existente - também é fácil verificar, ligandonext()
antes do foreach).fonte
Se você não deseja perder a posição atual do ponteiro, basta criar um alias para a matriz.
fonte
reset()
já retorna o primeiro elemento, portanto, não há necessidade de usarcurrent()
-echo reset($arr)
deve ser suficiente #current
parareset
evitar aviso PHP / erro produzido em casos de referência, por exemplo,current(array_filter(...));
em 3v4l .current($array)
você pode obter o primeiro elemento de uma matriz, de acordo com o manual do PHP .Por isso, funciona até que você reposicione o ponteiro da matriz e, caso contrário, precisará redefinir a matriz.
fonte
current($array)
funcionará apenas se o ponteiro da matriz estiver "atualmente" apontando para o primeiro elemento; caso contrário,reset($array)
seria necessário.current()
não requer mais uma referência, embora os documentos PHP não reflitam isso. Então, acho que essa se tornou a melhor solução.Você pode obter o enésimo elemento com uma construção de idioma, "lista":
Com a
array_keys
função, você pode fazer o mesmo com as teclas:fonte
list($first_value) = $my_array;
na minha opinião, a melhor opção. Ele não possui os problemas das outras respostas apresentadas aqui: nenhum "exagero" porque não copia nem o array ou cria um novo. Sem "referências": a matriz não é modificada. No "reset": nenhuma alteração no ponteiro interno da matriz ...int
, tente fazerlist($firstItem) = array('key1' => 'value1');
, e você obterá um erroNotice: Undefined offset: 0
list($x) = foo();
é equivalente a$x = foo()[0];
. Observe que isso não é necessariamente o mesmo que "obter o primeiro item", pois mesmo uma matriz com índice inteiro pode não ter um elemento com a chave 0. No meu caso, eu estava fazendo "list ($ order) = get_order ($ user) ; " mas "get_order" estava retornando pedidos codificados por seu ID, que geralmente não era 0. Como @Sergiy diz, array_values () corrige isso, mas diminui a eficiência e (mais importante) a legibilidade do código.PHP 5.4+:
fonte
$array_values = array_values($array); $value = $array_values[0];
O PHP 7.3 adicionou duas funções para obter a primeira e a última chave de uma matriz diretamente sem modificar a matriz original e sem criar objetos temporários:
Além de serem semanticamente significativas, essas funções nem movem o ponteiro do array (como
foreach
faria).Tendo as chaves, é possível obter os valores diretamente pelas chaves.
Exemplos (todos eles requerem PHP 7.3 ou superior)
Obtendo a primeira / última chave e o valor:
Obtendo o primeiro / último valor como one-liners, assumindo que a matriz não possa estar vazia :
Obtendo o primeiro / último valor como one-liners, com padrões para matrizes vazias:
fonte
$first_value = $my_array[array_key_first($my_array)] ?? null;
Suponha:
Apenas use:
para obter o primeiro elemento ou
para obter a primeira chave.
Ou você pode desvincular o primeiro se desejar removê-lo.
fonte
current
então?Algumas matrizes não funcionam com funções como
list
,reset
oucurrent
. Talvez sejam matrizes "falsas" - implementando parcialmente o ArrayIterator, por exemplo.Se você deseja obter o primeiro valor, independentemente da matriz, pode causar um curto-circuito em um iterador:
Seu valor estará disponível em
$value
e o loop será interrompido após a primeira iteração. Isso é mais eficiente do que copiar uma matriz potencialmente grande para uma função como array_unshift (array_values ($ arr)).Você também pode pegar a chave dessa maneira:
Se você está chamando isso de uma função, basta retornar mais cedo:
fonte
Dos ajudantes do Laravel :
A matriz que está sendo passada por valor para a função, o reset () afeta o ponteiro interno de uma cópia da matriz e não toca na matriz original (observe que ela retorna
false
se a matriz estiver vazia).Exemplo de uso:
Além disso, aqui está uma alternativa. É muito marginalmente mais rápido, mas mais interessante. Permite alterar facilmente o valor padrão se a matriz estiver vazia:
Para o registro, aqui está outra resposta minha , para o último elemento da matriz.
fonte
Mantenha isso simples! Há muitas respostas corretas aqui, mas para minimizar toda a confusão, essas duas funcionam e reduzem muitas despesas gerais:
key($array)
obtém a primeira chave de uma matrizcurrent($array)
obtém o primeiro valor de uma matrizEDIT:
Sobre os comentários abaixo. O exemplo a seguir será exibido:
string(13) "PHP code test"
fonte
current
é igual ao elemento atual. Você precisa redefinir o ponteiro para o início da matriz para garantir que esteja realmente no início.Simplesmente faça:
fonte
Eu faria
echo current($array)
.fonte
current()
não erro quando não referências são passadas. Desde que o ponteiro ainda esteja no começo, isso funciona.reset
produz o aviso "Somente variáveis devem ser passadas por referência", enquantocurrent
isso não acontece: Exemplo online do PHP Editorcurrent(array_filter(...));
.next()
,end()
ou qualquer outra função que o ponteiro interno modifica matriz. No meu exemplo,current()
retorna nulo porque o ponteiro interno está "fora do intervalo" da matriz. Mas pode "virtualmente" apontar para qualquer elemento / aleatório também.Resultado:
fonte
fonte
Isso é muito mais eficiente do que
array_values()
porque aeach()
função não copia toda a matriz.Para mais informações, consulte http://www.php.net/manual/en/function.each.php
fonte
because the each() function does not copy the entire array.
1Uma maneira arrogante é:
fonte
reset()
o ponteiro do array como redefinido antes deforeach
ser chamado.Obtenha o primeiro elemento:
Obter o último elemento
fonte
A maioria desses trabalhos! MAS para uma chamada rápida de linha única (poucos recursos):
Embora isso funcione e decentemente bem, consulte também minha resposta adicional: https://stackoverflow.com/a/48410351/1804013
fonte
current($array)
, o que exige que o ponteiro interno da matriz esteja no primeiro elemento de qualquer maneira, nesse caso,echo reset($array)
é o mais apropriado.Eu acho que usar array_values seria sua melhor aposta aqui. Você pode retornar o valor no índice zero a partir do resultado dessa função para obter 'apple'.
fonte
Isso é um pouco tarde para o jogo, mas me foi apresentado um problema em que minha matriz continha elementos de matriz como filhos dentro dela e, portanto, não conseguia apenas obter uma representação em cadeia do primeiro elemento da matriz. Por usando PHP
current()
função , eu consegui isto:Graças a todas as soluções atuais, me ajudaram a chegar a essa resposta, espero que isso ajude alguém em algum momento!
fonte
Usar:
Por padrão,
array_slice
não preserva chaves, para que possamos usar com segurança zero como índice.fonte
Duas soluções para você.
Solução 1 - Basta usar a chave. Você não disse que não pode usá-lo. :)
Solução 2 - array_flip () + key ()
Solução 3 - array_keys ()
fonte
Esta não é uma resposta tão simples no mundo real. Suponha que tenhamos esses exemplos de respostas possíveis que você pode encontrar em algumas bibliotecas.
Como você pode ver, temos várias soluções de uma linha que funcionam bem em alguns casos, mas não em todas.
Na minha opinião, você deve ter esse manipulador apenas com matrizes.
Agora falando sobre desempenho, supondo que sempre tenhamos array, assim:
array_shift
é mais rápido quereset
, mais rápido que [count () - 1], e esses três são mais rápidos quearray_values
earray_slice
.fonte
Eu imagino que o autor apenas estava procurando uma maneira de obter o primeiro elemento de uma matriz depois de obtê-lo de alguma função ( mysql_fetch_row , por exemplo) sem gerar um STRICT "Somente variáveis devem ser passadas por referência".
Nesse caso, quase todas as formas descritas aqui receberão essa mensagem ... e algumas delas usam muita memória adicional duplicando uma matriz (ou parte dela). Uma maneira fácil de evitá-lo é apenas atribuir o valor embutido antes de chamar qualquer uma dessas funções:
Dessa forma, você não recebe a mensagem STRICT na tela nem nos logs e não cria matrizes adicionais. Ele funciona com matrizes associativas AND indexadas .
fonte
Gosto do exemplo "list", mas "list" funciona apenas no lado esquerdo de uma tarefa. Se não quisermos atribuir uma variável, seremos forçados a criar um nome temporário, o que na melhor das hipóteses polui nosso escopo e, na pior das hipóteses, substitui um valor existente:
O texto acima substituirá qualquer valor existente de $ x, e a variável $ x ficará suspensa enquanto esse escopo estiver ativo (o final dessa função / método ou para sempre, se estivermos no nível superior). Isso pode ser contornado usando call_user_func e uma função anônima, mas é desajeitado:
Se usarmos funções anônimas como essa, poderemos nos safar de reset e array_shift, mesmo que eles usem passagem por referência. Isso ocorre porque chamar uma função vincula seus argumentos, e esses argumentos podem ser passados por referência:
No entanto, isso é realmente um exagero, pois call_user_func executará essa atribuição temporária internamente. Isso nos permite tratar as funções de passagem por referência como se fossem passagem por valor, sem nenhum aviso ou erro:
fonte
Uma pequena alteração no que Sarfraz postou é:
fonte
Eu não gosto de mexer com o ponteiro interno da matriz, mas também é ineficiente criar uma segunda matriz com
array_keys()
ouarray_values()
, então eu geralmente defino isso:fonte
Tente o seguinte:
fonte