Определить последнюю итерацию

Beavis

Banned
Определить последнюю итерацию

Какой правильный способ определить, является ли данная итерация цикла последней?
Обычно пользовался смарти, где подобного вопроса не возникало, а в php-шаблонах только всякие костыли приходят в голову чтобы это реализовать.
Просмотрел spl'ные итераторы, там вроде тоже такого нет.
 

Вурдалак

Продвинутый новичок
Наверное, нет. Лучше просто передать в шаблон переменную, содержащую последний ключ. Через end и key.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
zerkms
Ну скажем headcrumbs или хлебные крошки сделать, при этом вывести последний тайтл раздела в теге <h1>
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Эм, для списка значений есть join(',', $array), не?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Эм, просто я вообще не понял каким боком к "последней итерации" было это:

или чтобы вывести список значений через запятую
Потому и написал про джоин. А так вообще цикл по массиву.
 

Beavis

Banned
Автор оригинала: c0dex
Эм, просто я вообще не понял каким боком к "последней итерации" было это:
а как сделаешь чтобы после последнего элемента не выводилась запятая?

-~{}~ 31.08.10 16:54:

например надо вывести список тегов к новости, каждый тег ссылка, разделены запятыми
 

zerkms

TDD infected
Команда форума
а как сделаешь чтобы после последнего элемента не выводилась запятая?
я в таких случаях добавляю запятую перед всеми, кроме первого

foreach ($tags as $i => $val)
{
if ($i != 0) { $result .= ', '; }
$result .= '<a href...';
}

альтернативный вариант - добавлять всегда, а потом substr'ом выпилить два знака (запятая + пробел)

ну как-то так
 

Beavis

Banned
если ключи идут по порядку, то можно легко выводить и после
if ($i < count($tags)-1) ...

альтернативный вариант - добавлять всегда, а потом substr'ом выпилить два знака (запятая + пробел)
это вообще не вариант для случая, когда шаблон не собирается сначала в строку

я вообще надеялся что можно сделать как нибудь так
PHP:
$iterator = new ArrayIterator($tags);
foreach ($iterator as $tag) {
   if (!$iterator->isLast()) ...
}
ну раз так нельзя, способ сделать менее красиво я сам выберу)
всем спасибо
 

Beavis

Banned
он и на последней итерации будет valid() :(

-~{}~ 31.08.10 17:25:

я вот такой код придумал) хотя немного страшно выглядит)
PHP:
$tags = array("1", "2", "3", "4");
$iterator = new ArrayIterator($tags);
while ($iterator->valid()) {
	echo $iterator->current();
	$iterator->next();
	if ($iterator->valid()) {
		echo ", ";
	}
}
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Я бы сделал цикл по всем тэгам, сделал их ссылками, а потом соединил через join()
 

Beavis

Banned
c0dex
если делать это в контролерре - там появится HTML
если в представлении, то слишком много логики для него
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Beavis
это лично дело каждого как делать, я делаю в представлении, так как это к нему относится формировать списки и работать с такими вещами в цикле, плюс оформление 100% должно быть в шаблоне, а не в контроллере.
 

Crys

Двинутый новичок
Обычно пользовался смарти, где подобного вопроса не возникало, а в php-шаблонах только всякие костыли приходят в голову чтобы это реализовать.
А посмотри, какой код генерирует Smarty... Не лучше, чем в "PHP". По сути, Smarty - обертка над PHP с добавлением некоторого функционала. Но это не значит, что в PHP по-умолчанию он должен присутствовать. Нужен, а нету - значит надо написать.

Если бы уж красивость была так критична, то смотрел бы в сторону этого варианта:

Код:
class ArrayIteratorExtended extends ArrayIterator {
	private $_last_index;
	public function __construct(array $array) {
		parent::__construct($array);
		$keys = array_keys($array);
		$this->_last_index = end($keys);
	}
	public function isLast() {
		return $this->_last_index==$this->key();
	}
}

$tags = array("1", "2", "3", "4"); 
$iterator = new ArrayIteratorExtended($tags);
foreach ($iterator as $tag) {
	echo $tag;
	if (!$iterator->isLast()) {
		echo ', ';
	}
}
 

Beavis

Banned
да это всё понятно, спасибо, просто перед тем как делать велосипед, надо было убедиться что php таких возможностей не предоставляет.
 
Сверху