Como obter o primeiro item de uma matriz PHP associativa?

146

Se eu tivesse uma matriz como:

$array['foo'] = 400;
$array['bar'] = 'xyz';

E eu queria tirar o primeiro item dessa matriz sem saber a chave, como eu faria isso? Existe uma função para isso?

Click Voto a favor
fonte
(referência) Matrizes e funções de matriz
Gordon

Respostas:

288

reset() fornece o primeiro valor da matriz se você tiver um elemento dentro da matriz:

$value = reset($array);

Também fornece FALSEcaso a matriz esteja vazia.

soulmerge
fonte
Observe:$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
cwallenpoole 6/06/2014
Mais informações sobre a função de redefinição: www.w3schools.com/php/func_array_reset.asp
Paul Chris Jones
E se eu quiser obter a chave e o valor?
Timberman 13/07
51

PHP <7.3

Se você não souber o suficiente sobre a matriz (não tem certeza se a primeira chave é foo ou bar ), a matriz também pode estar vazia .

Portanto, seria melhor verificar, especialmente se houver a chance de o valor retornado ser o booleano FALSE:

$value = empty($arr) ? $default : reset($arr);

O código acima usa resete, portanto, tem efeitos colaterais (redefine o ponteiro interno da matriz); portanto, você pode preferir usar array_slicepara acessar rapidamente uma cópia do primeiro elemento da matriz:

$value = $default;
foreach(array_slice($arr, 0, 1) as $value);

Supondo que você deseja obter a chave e o valor separadamente , é necessário adicionar o quarto parâmetro em array_slice:

foreach(array_slice($arr, 0, 1, true) as $key => $value);

Para obter o primeiro item como um par ( key => value):

$item = array_slice($arr, 0, 1, true);

Modificação simples para obter o último item, chave e valor separadamente:

foreach(array_slice($arr, -1, 1, true) as $key => $value);

desempenho

Se a matriz não for realmente grande, você realmente não precisa array_slicee pode obter uma cópia de toda a matriz de chaves e obter o primeiro item:

$key = count($arr) ? array_keys($arr)[0] : null;

Porém, se você tiver uma matriz muito grande, a chamada array_keysexigirá mais tempo e memória do que array_slice(ambas as funções percorrem a matriz, mas a última termina assim que reunir o número necessário de itens - que é um).

Uma exceção notável é quando você tem a primeira chave que aponta para um objeto muito grande e complicado. Nesse caso array_sliceirá duplicar esse primeiro objeto grande, enquanto array_keyssó vai pegar as chaves.

PHP 7.3

Implementa o PHP 7.3 array_key_first()e também array_key_last(). Elas são fornecidas explicitamente para acessar a primeira e a última chave com eficiência, sem redefinir o estado interno da matriz como efeito colateral.

Portanto, no PHP 7.3, o primeiro valor de $arraypode ser acessado com

$array[array_key_first($array)];

Você ainda deve verificar se a matriz não está vazia, ou você receberá um erro:

$firstKey = array_key_first($array);
if (null === $firstKey) {
    $value = "Array is empty"; // An error should be handled here
} else {
    $value = $array[$firstKey];
}
LSerni
fonte
@AhmedShefeer bem, a outra resposta não é apenas a aceita, mas existe há mais oito anos . Estou pegando as migalhas aqui :-D. Mas obrigado pelo voto de confiança!
LSerni
1
Parece-me que esta é a melhor resposta, já que a única não preterida que fornece a chave e o valor é o loop foreach anulado, o que é estranho. As outras respostas fornecem apenas o valor sem a chave.
sootsnoot
1
adorei essa abordagem moderna e atualizada com o tempo.
sanjeet bisht 20/01/19
@LSerni Não sei se você ainda está ativo, mas eu estava preso e esse post bem explicado e atualizado me salvou. Obrigado
izk
@izk Estou sempre ativo! :-D
LSerni
44

Loop falso que quebra na primeira iteração:

$key = $value = NULL;
foreach ($array as $key => $value) {
    break;
}

echo "$key = $value\n";

Ou use each()( aviso: descontinuado a partir do PHP 7.2.0 ):

reset($array);
list($key, $value) = each($array);

echo "$key = $value\n";
John Kugelman
fonte
2
Provavelmente porque reset () é mais simples.
MJS
1
Porque a solução está na sua primeira linha de código, mas você continua escrevendo outra linha completamente desnecessária.
Markus
21
redefinição de rotina voltar a chave
HarryFink
3
+1 para o "loop falso". Eu precisei recuperar a chave e o valor dos primeiros elementos, sem passar por cada elemento. A reset()função recuperaria apenas o primeiro valor.
Phil Cross
2
+1 para o loop falso, bem, eu preciso manteve a chave para redefinir não era uma opção
isJustMe
25

Existem algumas opções. array_shift()retornará o primeiro elemento, mas também removerá o primeiro elemento da matriz.

$first = array_shift($array);

current() retornará o valor da matriz que seu ponteiro de memória interna está apontando, que é o primeiro elemento por padrão.

$first = current($array);

Se você quiser ter certeza de que está apontando para o primeiro elemento, sempre poderá usar reset().

reset($array);
$first = current($array);
Jeremy Ruten
fonte
3
Gosto dessa resposta como a mais completa, mas a nota reset()realmente retorna o elemento, portanto, depois de com a $first = current($array)é redundante.
21813 Tom Auger
9

Apenas para que possamos ter outras opções: reset($arr);bom o suficiente se você não estiver tentando manter o ponteiro da matriz no lugar e, com matrizes muito grandes, isso gera uma quantidade mínima de sobrecarga. Dito isto, existem alguns problemas com isso:

$arr = array(1,2);
current($arr); // 1
next($arr);    // 2
current($arr); // 2
reset($arr);   // 1
current($arr); // 1 !This was 2 before! We've changed the array's pointer.

A maneira de fazer isso sem alterar o ponteiro:

$arr[reset(array_keys($arr))]; // OR
reset(array_values($arr));

O benefício de $arr[reset(array_keys($arr))];é que ele gera um aviso se a matriz estiver realmente vazia.

cwallenpoole
fonte
resposta muito descritiva e significa muito para os outros. Obrigado cara.
Jigar7521
7

Outra maneira fácil e simples de fazer isso é usar array_values

array_values($array)[0]
Principiante
fonte
reset()é uma opção muito melhor, pois retorna false se a matriz estiver vazia. sua solução não vai funcionar, por exemplo, na questão
Northys
1
No PHP 7+, algo assim funcionaria:array_values($array)[0] ?? FALSE
MarthyM 7/18/18
4

Teste se a variável a é uma matriz antes de obter o primeiro elemento. Ao criar dinamicamente a matriz, se estiver definida como nula, você receberá um erro.

Por exemplo:

if(is_array($array))
{
  reset($array);
  $first = key($array);
}
w3bMak3r
fonte
3

Nós podemos fazer $first = reset($array);

Ao invés de

reset($array);
$first = current($array);

Como reset()

retorna o primeiro elemento da matriz após a redefinição;

Suryasish Dey
fonte
2

Você pode fazer:

$values = array_values($array);
echo $values[0];
d0niek
fonte
2

Use a função reset () para obter o primeiro item dessa matriz sem conhecer a chave para isso assim.

$value = array('foo' => 400, 'bar' => 'xyz');
echo reset($value);

saída // 400

Wakar Ahmad Khan
fonte
2

Você pode tentar isso.

Para obter o primeiro valor da matriz: -

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   var_dump(current($large_array));
?>

Para obter a primeira chave da matriz

<?php
   $large_array = array('foo' => 'bar', 'hello' => 'world');
   $large_array_keys = array_keys($large_array);
   var_dump(array_shift($large_array_keys));
?>
Caminhar
fonte
1

Você poderia usar array_shift

Cesar
fonte
4
Mas esteja ciente de que a matriz terá um item removido.
challet
1

Faço isso para obter o primeiro e o último valor. Isso funciona com mais valores também.

$a = array(
    'foo' => 400,
    'bar' => 'xyz',
);
$first = current($a);   //400
$last = end($a);    //xyz
Daantje
fonte
Isso funciona apenas quando o ponteiro interno está no primeiro elemento. Embora isso seja bom porque não redefine a posição do ponteiro, ele só funciona quando o ponteiro já está parado.
Cjc # 10/18
1

A partir do PHP 7.3.0 é possível fazer sem redefinir o ponteiro interno. Você usaria array_key_first. Se você tem certeza de que sua matriz possui valores, basta fazer o seguinte:

$first = $array[array_key_first($array)];

Provavelmente, você desejará lidar com o caso em que a matriz está vazia:

$first = (empty($array)) ? $default : $array[array_key_first($array)];
cjc
fonte
-3

você pode apenas usar $array[0]. ele vai te dar o primeiro item sempre

Kareem Salem
fonte