Нахождение последней пары в ассоциативном массиве - PullRequest
2 голосов
/ 30 октября 2009

Я перебираю ассоциативный массив с foreach. Я хотел бы иметь возможность проверить, является ли обрабатываемая пара ключ-значение последней, поэтому я могу уделить ей особое внимание. Есть идеи, как я могу сделать это наилучшим образом?

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
}

Ответы [ 5 ]

7 голосов
/ 30 октября 2009

Все просто, без счетчиков и других «хаков».

foreach ($array as $key => $value) {

   // your stuff

   if (next($array) === false) {
      // this is the last iteration
   }
}

Обратите внимание, что вы должны использовать ===, потому что функция next() может возвращать не булево значение, которое оценивается как false, например 0 или "" (пусто) строка).

5 голосов
/ 19 мая 2012

нам не нужно перебирать массив с foreach, мы можем использовать php-функции end (), key () и current (), чтобы добраться до последнего элемента и получить его ключ + значение.

<?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";

?>

Если вы хотите проверить это в итерации, функция end () все еще может быть полезна:

foreach ($a as $key => $value) {
    if ($value == end($a)) {
      // this is the last element
    }
}
3 голосов
/ 30 октября 2009

Предполагая, что вы не изменяете массив во время итерации, вы можете поддерживать счетчик, который уменьшается в цикле, и как только он достигает 0, вы обрабатываете последнее:

<?php
$counter = count($kvarr);
foreach ($kvarr as $key => $value)
{
    --$counter;
    if (!$counter)
    {
        // deal with the last element
    }
}
?>
3 голосов
/ 30 октября 2009

Есть довольно много способов сделать это, поскольку другие ответы, несомненно, покажут. Но я бы предложил изучить SPL и его CachingIterator . Вот пример:

<?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";
    }
}

Это более многословно, чем простой foreach, но не так уж много. И все разные итераторы SPL открывают для вас целый новый мир, как только вы их изучите :) Вот хороший учебник.

1 голос
/ 30 октября 2009

Вы можете использовать функции обхода указателя массива (в частности, next), чтобы определить, есть ли другой элемент после текущего:

$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)

Обратите внимание, что этот метод не будет работать, если ваш массив содержит элементы со значением FALSE, и вам нужно обработать последний элемент после выполнения вашего обычного тела цикла (поскольку указатель массива передается путем вызова next) или запомните значение.

...