Encontrar último par na matriz associativa
-
22-07-2019 - |
Pergunta
Eu estou looping através de uma matriz associativa com um foreach. Eu gostaria de ser capaz de verificar se o par de chaves valor a ser tratada é a última que eu possa dar-lhe um tratamento especial. Alguma idéia de como eu posso fazer isso da melhor maneira?
foreach ($kvarr as $key => $value){
// I'd like to be able to check here if this key value pair is the last
// so I can give it special treatment
}
Solução
Assumindo que você não está alterando a matriz durante a iteração através dele, você pode manter um contador que diminui em loop e uma vez que atinge 0, você está lidando com o passado:
<?php
$counter = count($kvarr);
foreach ($kvarr as $key => $value)
{
--$counter;
if (!$counter)
{
// deal with the last element
}
}
?>
Outras dicas
Simples como isso, livre de contadores e outros 'hacks'.
foreach ($array as $key => $value) { // your stuff if (next($array) === false) { // this is the last iteration } }
Por favor note que você tem que usar ===
, porque a função next()
pode retornar um valor não-booleano que avalia a false
, como 0
ou "" (string vazia).
não precisamos para percorrer a matriz com foreach, podemos usar o end (), key () e corrente () funções de PHP para chegar ao último elemento e obtê-lo é a chave valor +.
<?php
$a = Array(
"fruit" => "apple",
"car" => "camaro",
"computer" => "commodore"
);
// --- go to the last element of the array & get the key + value ---
end($a);
$key = key($a);
$value = current($a);
echo "Last item: ".$key." => ".$value."\n";
?>
Se você quiser dar uma olhada na iteração, a função end () ainda pode ser útil:
foreach ($a as $key => $value) {
if ($value == end($a)) {
// this is the last element
}
}
Existem algumas maneiras de fazer isso, como outras respostas, sem dúvida, mostrar. Mas gostaria de sugerir que aprender SPL e sua CachingIterator . Aqui está um exemplo:
<?php
$array = array('first', 'second', 'third');
$object = new CachingIterator(new ArrayIterator($array));
foreach($object as $value) {
print $value;
if (!$object->hasNext()) {
print "<-- that was the last one";
}
}
É mais detalhado do que simples foreach, mas não tanto assim. E todas as diferentes iterators SPL abrir um mundo totalmente novo para você, uma vez que você aprende-las :) Aqui está um bom tutorial.
Pode-se usar as funções de travessia de ponteiro matriz (especificamente next
) para determinar se há um outro elemento após o atual:
$value = reset($kvarr);
do
{
$key = key($kvarr);
// Do stuff
if (($value = next($kvarr)) === FALSE)
{
// There is no next element, so this is the last one.
}
}
while ($value !== FALSE)
Note que este método não funcionará se a matriz contém elementos cujo valor é FALSE
, e você vai precisar para lidar com o último elemento depois de fazer o seu corpo do ciclo usual (porque o ponteiro do array é avançada pelo telefone next
) ou então memoize o valor.