2012-06-15 46 views
2

我只是學習二郎芝加哥老闆,想知道我怎麼可以做類似這樣(以僞)的東西:在我的模板顯示環路一些HTML每個N元素

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

回答

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並以更高效但更不可讀的方式進行格式化。

0

如果你需要「tabify」列表中,你可以使用這個功能我剛剛創建:

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>" 

這是你需要的嗎? 只是問你是否有任何問題!