[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: foreach последний элемент
glock18
Привет всем.

В общем, вопрос состоит в следующем:

Я не нашел в php достаточно очевидной вещи, как проверка на то, указывает внутренний указатель массива на последний элемент (last($array) или что-то в этом духе).

Есть целая куча способов определить его, но все они либо
1. громоздкие.
2. громоздкие.
3. некрасивые и громоздкие.

Задача крайне тривиальная, и часто многим приходилось делать что-то такое. Может кто просветит? smile.gif




Спустя 3 минуты, 44 секунды (6.04.2009 - 13:48) waldicom написал(а):
Может быт просто сохранять текущий элемент в переменной и при выходе из foreach в переменной и будет последний элемент. Или задача другая стоит?

Спустя 1 час, 52 минуты, 49 секунд (6.04.2009 - 15:41) Viking написал(а):
специального метода для foreach видимо нет
а так вот вроде не очень громодзкий, и по-своему красивый
PHP
$count count($arr);
foreach(
$arr as $val) {

  if(!--
$count) echo $val." - фсе, последний...";

}

Спустя 34 минуты, 25 секунд (6.04.2009 - 16:16) glock18 написал(а):
В общем то задача очень близка к стандартному implode. Есть только одно исключение, в том, что каждый элемент массива не строка, а объект, из которого нужно получить атрибут.

смысл такой, что нужно получить строку как implode(', ', $stringArray), только с $objectArray.

2 viking: очень интересно)) лучшего я не придумал. Спасибо за помощь.

ЗЫ: я так вижу, здесь жизнь кипит)) заходить буду. может что и сам посоветовать смогу

Спустя 2 часа, 31 минута, 55 секунд (6.04.2009 - 18:48) Viking написал(а):
тогда лучше так
PHP
$result = reset($arr)->getVal();
while(
next($arr)) $result.=",".current($arr)->getVal();

Спустя 1 час, 32 минуты, 20 секунд (6.04.2009 - 20:20) sergeiss написал(а):
Я до конца не понял начальный вопрос.
1. Надо определить, указывает ли внутренний указатель массива на последний элемент, или
2. Просто найти последний элемент массива.

Вторая задача решается не просто, а очень просто. Есть такая функция end(). Безо всяких циклов.
Из хэлпа:
Код
Описание
mixed end ( array &$array )
end() устанавливает внутренний указатель array на последний элемент и возвращает его значение.


Если же надо решить первую задачу, т.е. в процессе работы определить, является ли данный элемент массива последним, то я хочу предложить другой вариант. Точнее, пару вариантов.
Через цикл for (в стиле "языка Си") smile.gif:
PHP
$arr=array( 1, 3, 5, 2, 6);
$c=count( $arr );
for(
 $i=0, $a=reset($arr); $a != false ; $i++, $a=next( $arr ) )
{
echo $a;
if(
 $i == ($c-1) ) // последний элемент массива
    echo ' - last one';
echo '<br>';
}

Пример выше похож на вариант Викинга, только используется for вместо foreach, что позволяет вести управление переменной цикла $i прямо в "заголовке" цикла.

Другой вариант - для циклов с заведомо уникальными ключами.
PHP
$key_last=key( end($arr) ); // получить ключ последнего элемента
foreach( $arr as $k => $val )
{
...
if(
 $k == $key_last ) .... // какие-то действия в случае, если это ключ последнего элемента
...
}


Я думаю, можно и еще варианты найти. Надо ли только? Я думаю, этого более чем достаточно будет.

Спустя 11 часов, 59 минут, 27 секунд (7.04.2009 - 08:19) glock18 написал(а):
2 sergeiss:
Спасибо за предложения. Я и сам имею порядка 3-4 вариантов решения этой задачи. Вопрос стоял в компактности.

На самом деле, он для меня главный в данном контексте, потому что мне нужно вставить данную конструкцию в view. То есть нужно уменьшить количество инструкций php (в частности для инициализации).

Еще иногда использую смарти, но там есть встроенная $smarty.foreach.$name.last функция, которая по сути делает примерно следующее:
PHP
$count count($array);
$iteration 1;
foreach (
$array as $value)
{
...
$iteration++;
}

Не очень круто))) Такое вставлять в html убийственно для его читаемости.

Еще раз спасибо всем за помощь!

2 viking:
да, второй вариант, в правду, еще лучше.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.