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
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top