}
elseif (is_object($seq) && $seq instanceof Traversable)
{
- return iterator_to_array($seq);
+ return $seq instanceof Countable ? $seq : iterator_to_array($seq);
}
else
{
--TEMPLATE--
{% for item in items %}
* {{ item }}
+ * {{ loop.index }}/{{ loop.index0 }}
+ * {{ loop.revindex }}/{{ loop.revindex0 }}
+ * {{ loop.first }}/{{ loop.last }}/{{ loop.length }}
+
{% endfor %}
{% for key, value in items|items %}
return array('items' => new ItemsIterator())
--EXPECT--
* bar
+ * 1/0
+ * 2/1
+ * 1//2
+
* foo
+ * 2/1
+ * 1/0
+ * /1/2
+
* foo/bar
* bar/foo
--- /dev/null
+--TEST--
+"for" tag iterates over iterable and countable objects
+--TEMPLATE--
+{% for item in items %}
+ * {{ item }}
+{% endfor %}
+
+{% for key, value in items|items %}
+ * {{ key }}/{{ value }}
+{% endfor %}
+
+{% for key in items|keys %}
+ * {{ key }}
+{% endfor %}
+--DATA--
+class ItemsIteratorCountable implements Iterator, Countable
+{
+ protected $values = array('foo' => 'bar', 'bar' => 'foo');
+ public function current() { return current($this->values); }
+ public function key() { return key($this->values); }
+ public function next() { return next($this->values); }
+ public function rewind() { return reset($this->values); }
+ public function valid() { return false !== current($this->values); }
+ public function count() { return count($this->values); }
+}
+return array('items' => new ItemsIterator())
+--EXPECT--
+ * bar
+ * foo
+
+ * foo/bar
+ * bar/foo
+
+ * foo
+ * bar