Obter o primeiro elemento de uma matriz


1071

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?


1
Como assim, não pode ser feito por referência?
Cjk

A função não deve funcionar usando &$arraycomo parâmetros.
Hsz

4
Eu suspeito que o que você "realmente" quer dizer com "não pode ser feito por referência", é que sua matriz está sendo retornada dinamicamente de um banco de dados e você não deseja passar a matriz para uma variável antes de pegar o primeiro elemento a partir dele. Se eu estiver certo, a grande maioria de todas as soluções fornecidas abaixo (incluindo a resposta aceita) é insuficiente.
cartbeforehorse

Você apenas precisa obtê-lo ou removê-lo da matriz existente?
Jo 17mo

Para uso básico de Arrays você pode rever este link technofusions.com/introduction-to-arrays-in-php
Vikrant Vir Bhalla

Respostas:


1367

Resposta original, mas cara (O (n)):

array_shift(array_values($array));

Em O (1):

array_pop(array_reverse($array));

Outros casos de uso, etc ...

Se a modificação (no sentido de redefinir ponteiros de matriz) $arraynão for um problema, você poderá usar:

reset($array);

Teoricamente, isso deve ser mais eficiente, se uma matriz "cópia" for necessária:

array_shift(array_slice($array, 0, 1));

Com o PHP 5.4+ (mas pode causar um erro de índice se vazio):

array_values($array)[0];

77
Um para a solução inteligente para evitar modificar a matriz original com array_values ()
ChrisR

44
Eu entendi o seguinte: <b> Padrões estritos </b>: Somente variáveis ​​devem ser passadas por referência. Solução alternativa agradável
Simone

191
Isso não é um pouco exagerado? E se a matriz contiver vários milhares de elementos? É justificável criar uma matriz totalmente nova apenas para obter seu primeiro elemento? list()e reset()são soluções muito melhores para minha opinião.
Martin Dimitrov

33
Concordo. Excesso total e recursos extraordinários pesados ​​em comparação com uma linha que redefine e retorna o valor atual: reset ($ array);
zmonteca 13/09/12

48
-1 Como os comentaristas acima disseram. É desconcertante para mim que isso tenha 101 votos positivos.
Lightness Races em órbita em

790

Como Mike apontou (a maneira mais fácil possível):

$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' )
echo reset($arr); // Echoes "apple"

Se você deseja obter a chave: (execute-a após a redefinição)

echo key($arr); // Echoes "4"

Da documentação do PHP :

reset misto (array & $ array );

Descrição:

reset () rebobina o ponteiro interno da matriz para o primeiro elemento e retorna o valor do primeiro elemento da matriz, ou FALSE se a matriz estiver vazia.


Embora seja passado por referência para redefinir, a matriz original não é modificada. Acho que é por isso que o hsz não quer passar por referência ..?
Dennis Jamin

10
O iterador da matriz é modificado. Se você fizer isso foreachcom a matriz de assuntos, você estragará tudo.
Zenexer

2
@ Zenexer isso nem sempre é (geralmente) verdadeiro. Geralmente, na prática, foreachcopiará a matriz pela qual ela está fazendo o loop.
Luke Cousins

1
@Angger após a reposição, você pode chamar key($arr)e você obterá '4' (adicionado em resposta)
Lepe

3
Nem o @Zenexer nem o Luke Cousins ​​estão certos: 1) o foreach não usa o ponteiro interno de uma matriz - em vez disso, cria o seu próprio ponteiro. É fácil verificar a redefinição de chamada dentro do foreach - o loop seguirá seu caminho sem nenhum efeito 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, ligando next()antes do foreach).
Dmikam 01/06

278
$first_value = reset($array); // First element's value
$first_key = key($array); // First element's key

2
Na verdade, não testei, mas parece que essa abordagem seria a mais eficiente.
precisa saber é

4
O único problema é a pergunta feita pelo valor, não a chave. Assim corrente ($ array) deve ser usado em vez de de chave ($ array)
zmonteca

4
@zmonteca $ first_value = reset ($ array); aqui você obtém o valor, a função reset () rebobina o ponteiro interno das matrizes e retorna o primeiro elemento.
S3Mi 03/10/12

1
a melhor resposta! estava procurando a equivalência de key () para obter o primeiro valor. Isso ajuda!
Alain Tiemblo

98
$arr = array( 9 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($arr); // echoes 'apple'

Se você não deseja perder a posição atual do ponteiro, basta criar um alias para a matriz.


1
não entendi, o que você quer dizer? Funciona bem se a chave da primeira é maior que as outras.
Yoda

29
+1 FYI reset()já retorna o primeiro elemento, portanto, não há necessidade de usar current()- echo reset($arr)deve ser suficiente #
Mike Mike

@ Mike, mas você pode preferir currentpara resetevitar aviso PHP / erro produzido em casos de referência, por exemplo, current(array_filter(...));em 3v4l .
precisa saber é o seguinte

91

current($array)você pode obter o primeiro elemento de uma matriz, de acordo com o manual do PHP .

Toda matriz possui um ponteiro interno para seu elemento "atual", que é inicializado para o primeiro elemento inserido na matriz.

Por isso, funciona até que você reposicione o ponteiro da matriz e, caso contrário, precisará redefinir a matriz.


4
Não sei por que essa não foi a resposta aceita, pois responde à pergunta de maneira simples e precisa.
relipse

26
current($array)funcionará apenas se o ponteiro da matriz estiver "atualmente" apontando para o primeiro elemento; caso contrário, reset($array)seria necessário.
Jon

6
Parece que 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.
18716 Ryan

@ Ryan concordou, mas esta solução foi dada 2 anos antes de 2014 nesta outra resposta desse mesmo tópico ... Estranho que essa frase incompleta tenha mais votos positivos.
precisa saber é o seguinte

70

Você pode obter o enésimo elemento com uma construção de idioma, "lista":

// First item
list($firstItem) = $yourArray;

// First item from an array that is returned from a function
list($firstItem) = functionThatReturnsArray();

// Second item
list( , $secondItem) = $yourArray;

Com a array_keysfunção, você pode fazer o mesmo com as teclas:

list($firstKey) = array_keys($yourArray);
list(, $secondKey) = array_keys($yourArray);

2
É exatamente isso que faço: 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 ...
J. Bruni

6
Solução muito elegante, mas lança um E_NOTICE quando a matriz está vazia.
Tgr

1
@ Mike sim, mas então não é tão elegante mais :)
Tgr

13
Isso não está errado ?! Ele só funciona se as chaves da matriz são int, tente fazer list($firstItem) = array('key1' => 'value1');, e você obterá um erroNotice: Undefined offset: 0
Marco Demaio

12
Para esclarecer: 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.
Warbo 02/08/13

55

PHP 5.4+:

array_values($array)[0];

Isto é para as pessoas legais que executam o melhor e o mais recente. ;)
Zenexer 13/11/13

1
Ele editou sua resposta em outubro de 2013 para incluir minha resposta que adicionei em abril.
precisa

PHP 4:$array_values = array_values($array); $value = $array_values[0];
zdick

38

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 foreachfaria).

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:

$my_array = ['IT', 'rules', 'the', 'world'];

$first_key = array_key_first($my_array);
$first_value = $my_array[$first_key];

$last_key = array_key_last($my_array);
$last_value = $my_array[$last_key];

Obtendo o primeiro / último valor como one-liners, assumindo que a matriz não possa estar vazia :

$first_value = $my_array[ array_key_first($my_array) ];

$last_value = $my_array[ array_key_last($my_array) ];

Obtendo o primeiro / último valor como one-liners, com padrões para matrizes vazias:

$first_value = empty($my_array) ? 'default' : $my_array[ array_key_first($my_array) ];

$last_value = empty($my_array) ? 'default' : $my_array[ array_key_last($my_array) ];

Encurtar com o operador de coalescência nula , geralmente nulo é o padrão, portanto: $first_value = $my_array[array_key_first($my_array)] ?? null;
Mitchell McKenna

29

Suponha:

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

Apenas use:

$array[key($array)]

para obter o primeiro elemento ou

key($array)

para obter a primeira chave.

Ou você pode desvincular o primeiro se desejar removê-lo.


9
Por que não usar simplesmente currententão?
Marco Demaio

27

Algumas matrizes não funcionam com funções como list, resetou current. 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:

foreach($array_with_unknown_keys as $value) break;

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:

foreach($array_with_unknown_keys as $key=>$value) break;

Se você está chamando isso de uma função, basta retornar mais cedo:

function grab_first($arr) {
    foreach($arr as $value) return $value;
}

Suponho que essa seja uma das maneiras mais rápidas, porque usar a construção de linguagem para cada uma, em vez de uma chamada de função (que é mais cara). designcise.com/web/tutorial/...
Ildar Amankulov

19

Dos ajudantes do Laravel :

function head($array)
{
    return reset($array);
}

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 retornafalse se a matriz estiver vazia).

Exemplo de uso:

$data = ['foo', 'bar', 'baz'];

current($data); // foo
next($data); // bar
head($data); // foo
next($data); // baz

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:

function head($array, $default = null)
{
    foreach ($array as $item) {
        return $item;
    }
    return $default;
}

Para o registro, aqui está outra resposta minha , para o último elemento da matriz.


17

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 matriz
current($array)obtém o primeiro valor de uma matriz


EDIT:
Sobre os comentários abaixo. O exemplo a seguir será exibido:string(13) "PHP code test"

$array = array
(
   '1'           => 'PHP code test',  
   'foo'         => 'bar', 5 , 5 => 89009, 
   'case'        => 'Random Stuff: '.rand(100,999),
   'PHP Version' => phpversion(),
   0             => 'ending text here'
);

var_dump(current($array));

11
Uhh currenté igual ao elemento atual. Você precisa redefinir o ponteiro para o início da matriz para garantir que esteja realmente no início.
precisa

current () obterá o elemento atual, não o primeiro. É diferente.
Amirhossein Tarmast

current funcionará se houver apenas um elemento na matriz.
Zameer Fouzan 24/09/19


14

Eu faria echo current($array).


1
@hsz Não importa, current()não erro quando não referências são passadas. Desde que o ponteiro ainda esteja no começo, isso funciona.
Dan Lugg

mas produz um Aviso que faz seus registros sujo e bem ... você deve se livrar de Avisos também wven se eles não são críticos
dmikam

1
@dmikam não, não. Realmente resetproduz o aviso "Somente variáveis ​​devem ser passadas por referência", enquanto currentisso não acontece: Exemplo online do PHP Editorcurrent(array_filter(...)); .
precisa saber é o seguinte

@CPHPython, parece que você está certo ... parece que eu tive essa idéia de atualidade dos tempos antigos do PHP 4, onde realmente produz erro fatal: sandbox.onlinephpfunctions.com/code/… O único problema que vejo ao usar o atual é que não garante que o elemento retornado seja o primeiro elemento de uma matriz (o ponteiro interno pode ser modificado pela função chamada). Virtualmente, ele pode retornar um elemento aleatório de uma matriz.
dmikam

1
@CPHPython Um pouco exemplo artificial, mas demonstra bem os meus pensamentos: sandbox.onlinephpfunctions.com/code/... basta imaginar que você receba a sua matriz de alguma função que utiliza 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.
dmikam

13
$arr = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
foreach($arr as $first) break;
echo $first;

Resultado:

apple

10
$myArray = array (4 => 'apple', 7 => 'orange', 13 => 'plum');
$arrayKeys = array_keys($myArray);

// The first element of your array is:
echo $myArray[$arrayKeys[0]];

Eu não segui o caminho descrito na resposta aceita. Teus utilizados graças
JayKandari

9
$array=array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

$firstValue = each($array)[1];

Isso é muito mais eficiente do que array_values()porque a each()função não copia toda a matriz.

Para mais informações, consulte http://www.php.net/manual/en/function.each.php


because the each() function does not copy the entire array.1

2
Mas a coisa é que você deve fazer uma redefinição antes, se o ponteiro interno não estiver no começo, você não obterá o primeiro elemento.
Carlos Goce

Mas cada () recebe um array por referência e a exigência das perguntas iniciais é não fazê-lo
dmikam

8

Uma maneira arrogante é:

$foo = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

function get_first ($foo) {
    foreach ($foo as $k=>$v){
        return $v;
    }
}

print get_first($foo);

3
Pelo menos você é honesto - é esquisito! Mas funciona e eu o usei no passado até aprender a técnica list () acima.
random_user_name 21/03

1
Se você estiver fazendo isso, use reset()o ponteiro do array como redefinido antes de foreachser chamado.
Tyzoid

7

Obtenha o primeiro elemento:

array_values($arr)[0]

Obter o último elemento

array_reverse($arr)[0]

As chaves numéricas são preservadas com array_reverse, para que ainda retorne o primeiro elemento. 3v4l.org/2729s
Don't Panic

7

A maioria desses trabalhos! MAS para uma chamada rápida de linha única (poucos recursos):

$array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo $array[key($array)];

// key($array) -> will return the first key (which is 4 in this example)

Embora isso funcione e decentemente bem, consulte também minha resposta adicional: https://stackoverflow.com/a/48410351/1804013


5
Isso equivale a usar 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.
Tyzoid

@ Tyzoid ele realmente escreveu outra resposta aqui com sua sugestão , mas ele omitiu sua explicação ... Obrigado.
precisa saber é o seguinte

@Tyzoid: Fiz uma resposta / atualização adicional algum tempo ir: stackoverflow.com/a/48410351/1804013
tfont

5

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'.


5

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:

<?php
    $original = array(4 => array('one', 'two'), 7 => array('three', 'four'));
    reset($original);  // to reset the internal array pointer...
    $first_element = current($original);  // get the current element...
?>

Graças a todas as soluções atuais, me ajudaram a chegar a essa resposta, espero que isso ajude alguém em algum momento!


4

Usar:

$first = array_slice($array, 0, 1);  
$val= $first[0];

Por padrão, array_slicenão preserva chaves, para que possamos usar com segurança zero como índice.


4

Duas soluções para você.

Solução 1 - Basta usar a chave. Você não disse que não pode usá-lo. :)

<?php
    // Get the first element of this array.
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Gets the first element by key
    $result = $array[4];

    // Expected result: string apple
    assert('$result === "apple" /* Expected result: string apple. */');
?>

Solução 2 - array_flip () + key ()

<?php
    // Get first element of this array. Expected result: string apple
    $array = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );

    // Turn values to keys
    $array = array_flip($array);

    // You might thrown a reset in just to make sure
    // that the array pointer is at the first element.
    // Also, reset returns the first element.
    // reset($myArray);

    // Return the first key
    $firstKey = key($array);

    assert('$firstKey === "apple" /* Expected result: string apple. */');
?>

Solução 3 - array_keys ()

echo $array[array_keys($array)[0]];

2

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.

$array1 = array();
$array2 = array(1,2,3,4);
$array3 = array('hello'=>'world', 'foo'=>'bar');
$array4 = null;

var_dump('reset1', reset($array1));
var_dump('reset2', reset($array2));
var_dump('reset3', reset($array3));
var_dump('reset4', reset($array4)); // Warning

var_dump('array_shift1', array_shift($array1));
var_dump('array_shift2', array_shift($array2));
var_dump('array_shift3', array_shift($array3));
var_dump('array_shift4', array_shift($array4)); // Warning

var_dump('each1', each($array1));
var_dump('each2', each($array2));
var_dump('each3', each($array3));
var_dump('each4', each($array4)); // Warning

var_dump('array_values1', array_values($array1)[0]); // Notice
var_dump('array_values2', array_values($array2)[0]);
var_dump('array_values3', array_values($array3)[0]);
var_dump('array_values4', array_values($array4)[0]); // Warning

var_dump('array_slice1', array_slice($array1, 0, 1));
var_dump('array_slice2', array_slice($array2, 0, 1));
var_dump('array_slice3', array_slice($array3, 0, 1));
var_dump('array_slice4', array_slice($array4, 0, 1)); // Warning

list($elm) = $array1; // Notice
var_dump($elm);
list($elm) = $array2;
var_dump($elm);
list($elm) = $array3; // Notice
var_dump($elm);
list($elm) = $array4;
var_dump($elm);

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:

$elm = empty($array) ? null : ...($array);

...you would use without errors:
$array[count($array)-1];
array_shift
reset
array_values
array_slice

array_shifté mais rápido que reset, mais rápido que [count () - 1], e esses três são mais rápidos que array_valuese array_slice.


2

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:

$first_item_of_array = current($tmp_arr = mysql_fetch_row(...));
// or
$first_item_of_array = reset($tmp_arr = func_get_my_huge_array());

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 .


1

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:

list($x) = some_array();
var_dump($x);

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:

var_dump(call_user_func(function($arr) { list($x) = $arr; return $x; },
                        some_array()));

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:

var_dump(call_user_func(function($arr) { return reset($arr); },
                        array_values(some_array())));

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:

var_dump(call_user_func('reset', array_values(some_array())));

1

Uma pequena alteração no que Sarfraz postou é:

$array = array(1, 2, 3, 4, 5);
$output = array_slice($array, 0, 1);
print_r ($output);

1

Eu não gosto de mexer com o ponteiro interno da matriz, mas também é ineficiente criar uma segunda matriz com array_keys()ou array_values(), então eu geralmente defino isso:

function array_first(array $f) {
    foreach ($f as $v) {
        return $v;
    }
    throw new Exception('array was empty');
}

1

Tente o seguinte:

$fruits = array( 4 => 'apple', 7 => 'orange', 13 => 'plum' );
echo reset($fruits)."\n";

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.