Como posso obter a última chave de uma matriz?
Como posso obter a última chave de uma matriz?
Respostas:
Uma solução seria usar uma combinação de end
e (citação) :key
end()
avança o ponteiro interno da matriz para o último elemento e retorna seu valor. key()
retorna o elemento de índice da posição atual da matriz. Portanto, uma parte do código como esta deve fazer o truque:
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
end($array); // move the internal pointer to the end of the array
$key = key($array); // fetches the key of the element pointed to by the internal pointer
var_dump($key);
Saída:
string 'last' (length=4)
ou seja, a chave do último elemento da minha matriz.
Depois que isso for feito, o ponteiro interno da matriz estará no final da matriz. Conforme indicado nos comentários, você pode executar reset()
na matriz para trazer o ponteiro de volta ao início da matriz.
reset()
) ;; mas você está certo ao apontar essa função, o que pode ser útil.
array('a', 'b', 'c', 'd', 'a')
ele retornará a chave 0 em vez de 4. #
Embora end()
pareça ser o mais fácil, não é o mais rápido. A alternativa mais rápida e muito mais forte é array_slice()
:
$lastKey = key(array_slice($array, -1, 1, true));
Como dizem os testes , em um array com 500000 elementos, é quase 7x mais rápido!
end($arr);$key = key($arr);reset($arr);
com (b) $key = key(array_slice($arr,-1,1,true));
... o que resultou em end()
ser MUITO mais rápido! end () = 0,05326 segundos, array_slice = 8,506 segundos ... hein?
end()
é mais rápido porque pode ser derivado de uma função C muito simples, como:int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
last
para o último elemento. Fazendo end()
praticamente O (1). :-)
eu prefiro
end(array_keys($myarr))
end((array_keys($myarr)))
para contornar o aviso.
Desde o PHP 7.3 (2018), existe (finalmente) a função para isso: http://php.net/manual/en/function.array-key-last.php
$array = ['apple'=>10,'grape'=>15,'orange'=>20];
echo array_key_last ( $array )
irá produzir
orange
Apenas use : echo $array[count($array) - 1];
int top(void){ int i; for(i = 0; stack[i] != '\0'; i++); return stack[--i]; }
que é interessante, mas não é bom para o negócio quando você estiver em um orçamento tempo
$a[1] = 1; $a[5] = 5; $a[0] = 0;
isso, terá uma matriz com as chaves (1, 5, 0), nessa ordem. count($a)
produzirá 3 e $a[2]
não está definido. Certamente não lhe devolve 5.
Não sei se isso será mais rápido ou não, mas parece mais fácil fazê-lo dessa maneira, e você evita o erro ao não passar uma função para end () ...
ele só precisava de uma variável ... não é grande coisa para escrever mais uma linha de código e, se necessário, desmarque-a.
$array = array(
'first' => 123,
'second' => 456,
'last' => 789,
);
$keys = array_keys($array);
$last = end($keys);
A partir do PHP7.3, você pode acessar diretamente a última chave (no nível externo) de uma matriz com array_key_last ()
Definitivamente coloca grande parte do debate nesta página na cama. É sem dúvida o melhor desempenho, não sofre efeitos colaterais e é uma técnica direta, intuitiva e de chamada única para fornecer exatamente o que essa pergunta busca.
Uma referência aproximada como prova: https://3v4l.org/hO1Yf
array_slice() + key(): 1.4 end() + key(): 13.7 array_key_last(): 0.00015
* A matriz de teste contém 500000 elementos, microtime repetido 100x, em seguida, calculada a média e multiplicada por 1000 para evitar notação científica. Crédito para @MAChitgarha por avaliação inicial comentada na resposta de @ TadejMagajna .
Isso significa que você pode recuperar o valor da chave final sem:
Essa função estava muito atrasada e uma adição bem-vinda ao cinto de ferramentas da função de matriz que melhora o desempenho, evita efeitos colaterais indesejados e permite código limpo / direto / intuitivo.
Aqui está uma demonstração :
$array = ["a" => "one", "b" => "two", "c" => "three"];
if (!function_exists('array_key_last')) {
echo "please upgrade to php7.3";
} else {
echo "First Key: " , key($array) , "\n";
echo "Last Key: " , array_key_last($array) , "\n";
next($array); // move array pointer to second element
echo "Second Key: " , key($array) , "\n";
echo "Still Last Key: " , array_key_last($array);
}
Resultado:
First Key: a
Last Key: c // <-- unaffected by the pointer position, NICE!
Second Key: b
Last Key: c // <-- unaffected by the pointer position, NICE!
Algumas notas:
array_key_last()
é a função irmão de array_key_first () .null
se a matriz estiver vazia.array_value_first()
& array_value_last()
) também teriam oferecido acesso ignorante aos elementos de suporte de livros, mas evidentemente não conseguiram obter votos suficientes para ganhar vida.Aqui estão algumas páginas relevantes que discutem os novos recursos:
ps Se alguém estiver avaliando algumas das outras técnicas, você pode consultar esta pequena coleção de comparações: ( Demo )
Duration of array_slice() + key(): 0.35353660583496 Duration of end() + key(): 6.7495584487915 Duration of array_key_last(): 0.00025749206542969 Duration of array_keys() + end(): 7.6123380661011 Duration of array_reverse() + key(): 6.7875385284424 Duration of array_slice() + foreach(): 0.28870105743408
Tente usar array_pop e array_keys funcionar da seguinte forma:
<?php
$array = array(
'one' => 1,
'two' => 2,
'three' => 3
);
echo array_pop(array_keys($array)); // prints three
?>
array_pop()
opera com o valor de retorno array_keys()
e não na matriz original.
A partir do PHP> = 7.3 array_key_last()
é a melhor maneira de obter a última chave de qualquer array. Usando combinação de end()
, key()
e reset()
apenas para obter última chave de uma matriz é ultrajante.
$array = array("one" => bird, "two" => "fish", 3 => "elephant");
$key = array_key_last($array);
var_dump($key) //output 3
compare isso com
end($array)
$key = key($array)
var_dump($key) //output 3
reset($array)
Você deve redefinir a matriz para que o ponteiro fique no início se estiver usando a combinação de end()
ekey()
Eu também gostaria de oferecer uma solução alternativa para esse problema.
Supondo que todas as suas chaves sejam numéricas sem intervalos, meu método preferido é contar a matriz e menos 1 a partir desse valor (para explicar o fato de que as chaves da matriz começam em 0.
$array = array(0=>'dog', 1=>'cat');
$lastKey = count($array)-1;
$lastKeyValue = $array[$lastKey];
var_dump($lastKey);
print_r($lastKeyValue);
Isso lhe daria:
int (1) cat
Você pode usar isto:
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
end($array);
echo key($array);
Outra solução é criar uma função e usá-la:
function endKey($array){
end($array);
return key($array);
}
$array = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($array);
$arr = array('key1'=>'value1','key2'=>'value2','key3'=>'value3');
list($last_key) = each(array_reverse($arr));
print $last_key;
// key3
$array = array(
'something' => array(1,2,3),
'somethingelse' => array(1,2,3,4)
);
$last_value = end($array);
$last_key = key($array); // 'somethingelse'
Isso funciona porque o PHP move seu ponteiro de matriz internamente por $ array
A melhor solução possível que também pode ser usada é usada em linha:
end($arr) && false ?: key($arr)
Esta solução é apenas expressão / declaração e fornece bom não é o melhor desempenho possível.
Exemplo de uso embutido:
$obj->setValue(
end($arr) && false ?: key($arr) // last $arr key
);
ATUALIZAÇÃO: No PHP 7.3+: use (é claro) o array_key_last()
método recém-adicionado .