Splurov
Новичок
foreach, isFirst(), isLast(), IteratorAggregate
Есть желание в php-шаблонах в циклах foreach делать проверки на первый/последний элемент массива. Также хочется, чтобы для этих проверок не нужно было считать количество элементов:
А хочется иметь методы isFirst() и isLast():
Имеет такое право на жизнь? 
Есть желание в php-шаблонах в циклах foreach делать проверки на первый/последний элемент массива. Также хочется, чтобы для этих проверок не нужно было считать количество элементов:
PHP:
$foo = array(
1=> 'first',
'second',
'third',
'fourth',
'fifth',
'sixth',
);
$length = count($foo);
$i = 0;
foreach ($foo as $k => $v) {
if ($i == 0) {
echo '(first) ';
}
if ($i + 1 == $length) {
echo '(last) ';
}
echo $k . '~' . $v . '<br />';
$i++;
}
PHP:
class Test_Array implements ArrayAccess, IteratorAggregate, Countable {
protected $iterator = null;
/* вырезал реализации стандартных методов */
public function getIterator($isNew = true) {
if ($isNew || is_null($this->iterator)) {
$this->iterator = new Test_Array_Iterator(clone $this);
}
return $this->iterator;
}
}
class Test_Array_Iterator implements Iterator {
/* вырезал реализации стандартных методов */
public function isFirst() {
return $this->current == 0;
}
public function isLast() {
return $this->current + 1 == $this->length;
}
}
// $foo идентичен массиву из предыдущего примера
$foo = new Test_Array($foo);
foreach ($foo as $k => $v) {
if ($foo->getIterator(false)->isFirst()) {
echo '(first) ';
}
if ($foo->getIterator(false)->isLast()) {
echo '(last) ';
}
echo $k . '~' . $v . '<br />';
}
