Нахождение последней пары в ассоциативном массиве

StackOverflow https://stackoverflow.com/questions/1651569

  •  22-07-2019
  •  | 
  •  

Вопрос

Я перебираю ассоциативный массив с 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
}
Это было полезно?

Решение

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

<?php
$counter = count($kvarr);
foreach ($kvarr as $key => $value)
{
    --$counter;
    if (!$counter)
    {
        // deal with the last element
    }
}
?>

Другие советы

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

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

   // your stuff

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

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

нам не нужно перебирать массив с помощью 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
    }
}

Есть много способов сделать это, поскольку другие ответы, несомненно, покажут. Но я бы предложил изучить 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 открывают для вас целый новый мир, как только вы их изучите :) Вот хороший учебник.

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

$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 ) или запомни значение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top