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?
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?
Respostas:
reset()
fornece o primeiro valor da matriz se você tiver um elemento dentro da matriz:
$value = reset($array);
Também fornece FALSE
caso a matriz esteja vazia.
$arr = array(/* stuff */); $val = $arr? reset($arr): /* value to indicate array is empty */;
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 reset
e, portanto, tem efeitos colaterais (redefine o ponteiro interno da matriz); portanto, você pode preferir usar array_slice
para 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);
Se a matriz não for realmente grande, você realmente não precisa array_slice
e 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_keys
exigirá 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_slice
irá duplicar esse primeiro objeto grande, enquanto array_keys
só vai pegar as chaves.
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 $array
pode 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];
}
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";
reset()
função recuperaria apenas o primeiro valor.
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);
reset()
realmente retorna o elemento, portanto, depois de com a $first = current($array)
é redundante.
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.
Outra maneira fácil e simples de fazer isso é usar array_values
array_values($array)[0]
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
array_values($array)[0] ?? FALSE
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;
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
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));
?>
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
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)];
você pode apenas usar $array[0]
. ele vai te dar o primeiro item sempre