В общем, вопрос состоит в следующем:
Я не нашел в php достаточно очевидной вещи, как проверка на то, указывает внутренний указатель массива на последний элемент (last($array) или что-то в этом духе).
Есть целая куча способов определить его, но все они либо
1. громоздкие.
2. громоздкие.
3. некрасивые и громоздкие.
Задача крайне тривиальная, и часто многим приходилось делать что-то такое. Может кто просветит?

Спустя 3 минуты, 44 секунды (6.04.2009 - 13:48) waldicom написал(а):
Может быт просто сохранять текущий элемент в переменной и при выходе из foreach в переменной и будет последний элемент. Или задача другая стоит?
Спустя 1 час, 52 минуты, 49 секунд (6.04.2009 - 15:41) Viking написал(а):
специального метода для foreach видимо нет
а так вот вроде не очень громодзкий, и по-своему красивый
а так вот вроде не очень громодзкий, и по-своему красивый
PHP |
$count = count($arr); |
Спустя 34 минуты, 25 секунд (6.04.2009 - 16:16) glock18 написал(а):
В общем то задача очень близка к стандартному implode. Есть только одно исключение, в том, что каждый элемент массива не строка, а объект, из которого нужно получить атрибут.
смысл такой, что нужно получить строку как implode(', ', $stringArray), только с $objectArray.
2 viking: очень интересно)) лучшего я не придумал. Спасибо за помощь.
ЗЫ: я так вижу, здесь жизнь кипит)) заходить буду. может что и сам посоветовать смогу
смысл такой, что нужно получить строку как implode(', ', $stringArray), только с $objectArray.
2 viking: очень интересно)) лучшего я не придумал. Спасибо за помощь.
ЗЫ: я так вижу, здесь жизнь кипит)) заходить буду. может что и сам посоветовать смогу
Спустя 2 часа, 31 минута, 55 секунд (6.04.2009 - 18:48) Viking написал(а):
тогда лучше так
PHP |
$result = reset($arr)->getVal(); |
Спустя 1 час, 32 минуты, 20 секунд (6.04.2009 - 20:20) sergeiss написал(а):
Я до конца не понял начальный вопрос.
1. Надо определить, указывает ли внутренний указатель массива на последний элемент, или
2. Просто найти последний элемент массива.
Вторая задача решается не просто, а очень просто. Есть такая функция end(). Безо всяких циклов.
Из хэлпа:
1. Надо определить, указывает ли внутренний указатель массива на последний элемент, или
2. Просто найти последний элемент массива.
Вторая задача решается не просто, а очень просто. Есть такая функция end(). Безо всяких циклов.
Из хэлпа:
Код |
Описание mixed end ( array &$array ) end() устанавливает внутренний указатель array на последний элемент и возвращает его значение. |
Если же надо решить первую задачу, т.е. в процессе работы определить, является ли данный элемент массива последним, то я хочу предложить другой вариант. Точнее, пару вариантов.
Через цикл for (в стиле "языка Си")

PHP |
$arr=array( 1, 3, 5, 2, 6); |
Пример выше похож на вариант Викинга, только используется for вместо foreach, что позволяет вести управление переменной цикла $i прямо в "заголовке" цикла.
Другой вариант - для циклов с заведомо уникальными ключами.
PHP |
$key_last=key( end($arr) ); // получить ключ последнего элемента |
Я думаю, можно и еще варианты найти. Надо ли только? Я думаю, этого более чем достаточно будет.
Спустя 11 часов, 59 минут, 27 секунд (7.04.2009 - 08:19) glock18 написал(а):
2 sergeiss:
Спасибо за предложения. Я и сам имею порядка 3-4 вариантов решения этой задачи. Вопрос стоял в компактности.
На самом деле, он для меня главный в данном контексте, потому что мне нужно вставить данную конструкцию в view. То есть нужно уменьшить количество инструкций php (в частности для инициализации).
Еще иногда использую смарти, но там есть встроенная $smarty.foreach.$name.last функция, которая по сути делает примерно следующее:
Спасибо за предложения. Я и сам имею порядка 3-4 вариантов решения этой задачи. Вопрос стоял в компактности.
На самом деле, он для меня главный в данном контексте, потому что мне нужно вставить данную конструкцию в view. То есть нужно уменьшить количество инструкций php (в частности для инициализации).
Еще иногда использую смарти, но там есть встроенная $smarty.foreach.$name.last функция, которая по сути делает примерно следующее:
PHP |
$count = count($array); |
Не очень круто))) Такое вставлять в html убийственно для его читаемости.
Еще раз спасибо всем за помощь!
2 viking:
да, второй вариант, в правду, еще лучше.