Don't use array_fill for full array
authorMarcin Misiurski <misiur66@gmail.com>
Mon, 5 Aug 2013 15:48:38 +0000 (17:48 +0200)
committerFabien Potencier <fabien.potencier@gmail.com>
Tue, 6 Aug 2013 05:44:33 +0000 (07:44 +0200)
lib/Twig/Extension/Core.php
test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test [new file with mode: 0644]

index e68687b..7eb7f9b 100644 (file)
@@ -1329,7 +1329,7 @@ function twig_constant($constant, $object = null)
  *
  * @param array   $items An array of items
  * @param integer $size  The size of the batch
- * @param string  $fill  A string to fill missing items
+ * @param mixed   $fill  A value used to fill missing items
  *
  * @return array
  */
@@ -1345,10 +1345,12 @@ function twig_array_batch($items, $size, $fill = null)
 
     if (null !== $fill) {
         $last = count($result) - 1;
-        $result[$last] = array_merge(
-            $result[$last],
-            array_fill(0, $size - count($result[$last]), $fill)
-        );
+        if ($fillCount = $size - count($result[$last])) {
+            $result[$last] = array_merge(
+                $result[$last],
+                array_fill(0, $fillCount, $fill)
+            );
+        }
     }
 
     return $result;
diff --git a/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test b/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test
new file mode 100644 (file)
index 0000000..72483f4
--- /dev/null
@@ -0,0 +1,33 @@
+--TEST--
+"batch" filter
+--TEMPLATE--
+{% for row in items|batch(3, 'fill') %}
+  <div class=row>
+  {% for column in row %}
+    <div class=item>{{ column }}</div>
+  {% endfor %}
+  </div>
+{% endfor %}
+--DATA--
+return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'))
+--EXPECT--
+<div class=row>
+      <div class=item>a</div>
+      <div class=item>b</div>
+      <div class=item>c</div>
+    </div>
+  <div class=row>
+      <div class=item>d</div>
+      <div class=item>e</div>
+      <div class=item>f</div>
+    </div>
+  <div class=row>
+      <div class=item>g</div>
+      <div class=item>h</div>
+      <div class=item>i</div>
+    </div>
+  <div class=row>
+      <div class=item>j</div>
+      <div class=item>k</div>
+      <div class=item>l</div>
+    </div>