为每个N元素显示一些循环html

时间:2012-06-15 06:30:16

标签: templates erlang chicagoboss

我正在和芝加哥老板一起学习Erlang,并且想知道我怎么能做类似的事情(伪代码):

foreach (items as item)
    if (i % 10 == 0)
        <tr>
    endif
    <td>...</td>
    if (i++ % 10 == 0)
        </tr>
    endif
endforeach

在我的模板中?

2 个答案:

答案 0 :(得分:1)

Erlang是一种功能语言,因此惯用的方式是以功能的方式进行。我们准备首先将数据表格化的函数:

-module(tabify).

-export([tabify/2]).

tabify(N, L) when is_list(L), is_integer(N), N > 0 ->
  tabify_(N, L).

tabify_(_, []) -> [];
tabify_(N, L) ->
  {Row, Rest} = row(L, N),
  [Row|tabify_(N, Rest)].

row(L, N) ->
  row(L, N, []).

row([], _, Accu) -> {lists:reverse(Accu), []};
row(Rest, 0, Accu) -> {lists:reverse(Accu), Rest};
row([H|T], N, Accu) -> row(T, N-1, [H|Accu]).

现在我们可以使用它了:

1> c(tabify).
{ok,tabify}
2> Data = [integer_to_list(X) || X <- lists:seq(1,100)].
["1","2","3","4","5","6","7","8","9","10","11","12","13",
 "14","15","16","17","18","19","20","21","22","23","24","25",
 "26","27","28",
 [...]|...]
3> Table = tabify:tabify(10,Data).
[["1","2","3","4","5","6","7","8","9","10"],
 ["11","12","13","14","15","16","17","18","19","20"],
 ["21","22","23","24","25","26","27","28","29","30"],
 ["31","32","33","34","35","36","37","38","39","40"],
 ["41","42","43","44","45","46","47","48","49","50"],
 ["51","52","53","54","55","56","57","58","59","60"],
 ["61","62","63","64","65","66","67","68","69","70"],
 ["71","72","73","74","75","76","77","78","79","80"],
 ["81","82","83","84","85","86","87","88","89","90"],
 ["91","92","93","94","95","96","97","98","99","100"]]
4> T = [["<tr>", [["<td>", Item, "</td>"] || Item <- Row ], "</tr>"]|| Row <- Table].
[["<tr>",
  [["<td>","1","</td>"],
   ["<td>","2","</td>"],
   ...

而不是让io子系统完成剩下的工作。上面的结构是众所周知的iolist,如果你把它放在任何io中,它将以与以下相同的方式正确地序列化:

6> iolist_to_binary(T).
<<"<tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td></tr><tr><t"...>>

如果表中有数千个项目,效率至关重要,可以将所有列表常量转换为二进制。您还可以在Data中转换为二进制数据。作为最后的手段,您可以重写tabify/2并以更有效但不太可读的方式进行格式化。

答案 1 :(得分:0)

如果您需要“列表”列表,您可以使用我刚刚创建的此功能:

tab_list(List1) ->
    lists:append(
        lists:flatten(
            lists:map(
                fun({Item, Idx}) -> 
                    if 
                        ((Idx - 1) rem 10) == 0 -> lists:concat(["<TR><TD>", Item, "</TD>"]); 
                        (Idx rem 10) == 0 -> lists:concat(["<TD>", Item, "</TD></TR>"]);
                        true -> lists:concat(["<TD>", Item, "</TD>"])
                    end
                end,
            lists:zip(List1, lists:seq(1, length(List1)))
            )
        ),
    if (length(List1) rem 10) == 0 -> ""; true -> "</TR>" end
).

当传递像["a", "b", "c", "d", "e", "f", "g", "h", "i", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "z"]这样的列表时,它会产生以下结果:

"<TR><TD>a</TD><TD>b</TD><TD>c</TD><TD>d</TD><TD>e</TD><TD>f</TD><TD>g</TD><TD>h</TD><TD>i</TD><TD>l</TD></TR><TR><TD>m</TD><TD>n</TD><TD>o</TD><TD>p</TD><TD>q</TD><TD>r</TD><TD>s</TD><TD>t</TD><TD>u</TD><TD>v</TD></TR><TR><TD>z</TD></TR>"

这是你需要的吗? 只要问你是否有任何问题!