Build 3x3 table from one array

I am new to ruby and still haven't got my mind around iterators although
I think they are really cool.

I am stuck trying to figure out how to take an array of data and
dynamically build a 3x3 html table from it without standard for loops.

Here is the code in JavaScript:

var MAX_ROW = 3;
var MAX_COL = 3;
var nIdx = 0;

print("<table>");
for (var r = 0; nIdx < aList.length && r < MAX_ROW; r++)
{
  print("<tr>");
  for (var c = 0; nIdx < aList.length && c < MAX_COL; c++)
  {
    print("<td>");

    print(aList[nIdx].name);
    nIdx++;

    print("</td>");
  } // cols
  print("</tr>");
} // rows
print("</table>");

Can someone point me in the right direction for how to do this. I found
each_index but still was at a loss.

Thanks for the help.
forest

···

--
Posted via http://www.ruby-forum.com/.

forest wrote:

I am stuck trying to figure out how to take an array of data and
dynamically build a 3x3 html table from it without standard for loops.

Here is the code in JavaScript:

*snip*

Can someone point me in the right direction for how to do this. I found
each_index but still was at a loss.

Without giving it a lot of thought, I'd do something to the effect of:

rows = [
    [ 'col1', 'col2', 'col3' ],
    [ 'cOl1', 'Col2', 'col3' ],
    [ 'col1', 'COL2', 'COl3' ],
]

output = ''

output << '<table>'
rows.each do |row|
    output << '<tr>'
    row.each do |col|
        output << "<td>#{col}</td>"
    end
    output << '</tr>'
end
output << '</table>'

puts output

···

--
Posted via http://www.ruby-forum.com/\.

I am stuck trying to figure out how to take an array of data and
dynamically build a 3x3 html table from it without standard for loops.

Here's one idea:

>> data = (1..9).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
>> require "enumerator"
=> true
>> puts "<table>"
<table>
=> nil
>> data.each_slice(3) do |row|
?> puts " <tr>"
>> row.each { |cell| puts " <td>#{cell}</td>" }
>> puts " </tr>"
>> end
   <tr>
     <td>1</td>
     <td>2</td>
     <td>3</td>
   </tr>
   <tr>
     <td>4</td>
     <td>5</td>
     <td>6</td>
   </tr>
   <tr>
     <td>7</td>
     <td>8</td>
     <td>9</td>
   </tr>
=> nil
>> puts "</table>"
</table>
=> nil

Hope that helps.

James Edward Gray II

···

On Mar 16, 2006, at 11:29 AM, forest wrote:

Pistos Christou wrote:

forest wrote:
> I am stuck trying to figure out how to take an array of data and
> dynamically build a 3x3 html table from it without standard for loops.
>
> Here is the code in JavaScript:
*snip*
> Can someone point me in the right direction for how to do this. I found
> each_index but still was at a loss.

puts %w(1 2 3 4 5 6 7 8 9).map{|x| "<td>" + x + "</td>" }.
  join.gsub(/(<td.*?\/td>){3}/,"<tr>\n \\&\n</tr>\n")

Thanks all. The each_slice solution I think will work the best for my
scenario. I really appreciate the help.

forest

···

>> data = (1..9).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
>> require "enumerator"
=> true
>> puts "<table>"
<table>
=> nil
>> data.each_slice(3) do |row|
?> puts " <tr>"
>> row.each { |cell| puts " <td>#{cell}</td>" }
>> puts " </tr>"
>> end

Hope that helps.

James Edward Gray II

--
Posted via http://www.ruby-forum.com/\.

>> require "enumerator"

Is this standard library?

I tried 'ri Enumerator' to learn more, but it just comes back talking
about SyncEnumerator, which is something else. (Trying the lowercase
'enumerator' didn't work at all.)

Yes, enumerator is part of the standard library. Go to http://ruby-doc.org/stdlib/ and find enumerator (right after English) in the left frame if ri isn't helping.

Tim

···

On Mar 16, 2006, at 1:10 PM, Matthew Moss wrote:

require "enumerator"

Is this standard library?

I tried 'ri Enumerator' to learn more, but it just comes back talking
about SyncEnumerator, which is something else. (Trying the lowercase
'enumerator' didn't work at all.)

I wrote next function (maybe need to be rewritten to method for Array
cass) -
  def array_to_table(arr, width)
    data = "<table>"
    arr.each_slice(width) do |row|
      data << "<tr>"
      row.each do |elem|
        data << ("<td>" + yield(elem) + "</td>")
      end
      data << "</tr>"
    end
    data << "</table>"
  end

Using -
<%= array_to_table(User.find(:all), 3) {|user| "<div
id='user_div'>#{user.name}</div>"} %>

···

--
Posted via http://www.ruby-forum.com/.