2012-02-25 42 views
18

我不能在我的生活中弄清楚如何在Twig循环中每隔OTHER迭代添加一个</tr><tr>你会如何制作一个带枝条的两柱桌子?

例如:

$numArray = array(12,13,14,15,16,17,18); 

传递给小枝,我会循环表所示:

<table> 
    {% for num in numArray %} 
    <tr> 
     <td> 
     {{num}} 
     </td> 
    </tr> 
    {% endfor %} 
</table> 

这将输出:

+-----------+ 
| 12  | 
+-----------+ 
| 13  | 
+-----------+ 
| 14  | 
+-----------+ 
| 15  | 
+-----------+ 
| 16  | 
+-----------+ 
| 17  | 
+-----------+ 
| 18  | 
+-----------+ 

我想怎么办得到这样的东西:

+-----------+-----------+ 
| 12  | 13  | 
+-----------+-----------+ 
| 14  | 15  | 
+-----------+-----------+ 
| 16  | 17  | 
+-----------+-----------+ 
| 18  |   | 
+-----------+-----------+ 

但我不能为我的生活找出一种方法来替换我的行输入与任何似乎不hacky。老实说,我甚至不能让哈克工作。有没有一种方法呢?或者,我是否应该编写自己的扩展?

回答

29

这样做的正确方法是使用批次过滤器。它在1.12.3中是新的。

<table> 
{% for row in numArray|batch(2) %} 
    <tr> 
    {% for column in row %} 
    <td>{{ column }}</td> 
    {% endfor %} 
    </tr> 
{% endfor %} 
</table> 

编号:http://twig.sensiolabs.org/doc/filters/batch.html

+0

这样一个真棒功能! – webDEVILopers 2014-12-01 12:34:51

5

像这样的工作:

<table> 
    <tr> 
    {% for num in numArray %} 
     <td> 
     {{num}} 
     </td> 
    {% if loop.index is even %} 
    </tr> 
    <tr> 
    {% endif %} 
    {% endfor %} 

    {% if num|length is odd %} 
    <td></td> 
    {% endif %} 
    </tr> 
</table> 

的另一种方式,那感觉更哈克:

<table> 
    {% for i in range(0, numArray|length-1, 2) %} 
    <tr> 
    <td>{{ numArray[i] }}</td> 
    <td>{{ numArray[i+1]|default("") }}</td> 
    </tr> 
    {% endfor %} 
</table> 
+0

谢谢。我最终写了一个扩展名,所以我可以回到一些PHP。但是,这当然是我正在寻找的答案。 – 2012-02-25 17:29:00

+0

嗨霍华德,你想要开源扩展的任何改变? – 2012-08-29 19:06:29

+2

更新:在Twig 1.12.3中添加了批次过滤器。 http://twig.sensiolabs.org/doc/filters/batch.html – dnagirl 2013-08-16 19:42:23