tags:

views:

101

answers:

3

I have come unstuck on a relatively (almost) trivial problem. I have a row of data that I want to display in tabular form (HTML). For some reason (possibly long day [again] behind the computer), I am not coming up with any elegant solutions (algorithms) to do this.

I have presented some sample data, and how such data would be displayed in the table. I would be grateful for some ideas on algos to implement this.

The output table has rows labelled with the various scores and the indices are displayed at the bottom.

I would like to be able to have a variable determine the number of columns to print, before a new table is printed underneath - to prevent ridiculously long tables.

so I want to write a function with the following signature (ignoring data types):

function create_table_html_from_rows(datarows, max_cols_per_table)

Here is the sample data and mock output table presentation

Row data:

index, Score, amount
1, level 1, 12.24
3, level 4, 14.61
9, level 10, 42.35
15, level 2, -8.12


Scores
======

Level 1  12.24   
Level 2                       -8.12
Level 3
Level 4         14.61
.....
Level 10               42.35
----------------------------------------
         |  1  |  3  |  9   |   15       <- Index

Pseudocode should be sufficient, however, if you snippet is in a programming language, it is perharps worth pointing out that I will be implementing my algorithm in Python, however any snippets in any of the following languages would be fine:

Python, C, C++, PHP, C#

A: 

Tomorrow is a new day. The problem is really trivial. Also there can not be elegant solution, just long one.

Also you can write even solution (with no respect to its elegancy or other), just to get your work done. And after that you will get ideas of where your thinking was stuck and how to code better solution.

Lavir the Whiolet
Lavir: You know you were right!. I stepped away from the computer for a few hours and whilst having a hot shower, a really elegant solution ocured to me :) I will accept one of the answers though, since at least they have put in the effort to try to help.
skyeagle
A: 

I'd do it in the following way (Note: the code is not tested / debugged at all!):

<?php
$lines = file ("data.txt");
foreach ($lines as $line) {
  $array = explode(",", $line);
  $level = $array[1];
  $index = $array[0];
  $amount = $array[2];
  $result[level][index] = $amount;
  $indeces[] = $index;
}

echo "Scores<br>\n======<br>\n"
echo "<table>";
foreach ($result as $level => $row) {
  echo "<tr>\n<td>$level\n";
  foreach ($indeces as $index) {
    echo "<td>";
    if (!isset($row[$index])) {
      echo "&nbsp;";
    } else {
      echo $row[$index];
    }
    echo "\n";
  }
}
echo "<tr>\n<td>\n";
foreach ($indeces as $index) {
  echo "<td>$index\n";
?>
Kel
A: 

I assumed you have Raw data stored similar to what I have below. Also, the level is non-unique.

<?
    $rowData = array( 
        0=> array('index'=>1, 'Score'=>"level 1", 'amount'=>12.24), 
        1=> array('index'=>3, 'Score'=>"level 4", 'amount'=>14.61),
        2=> array('index'=>9, 'Score'=>"level 10", 'amount'=>42.35),
        3=> array('index'=>15, 'Score'=>"level 2", 'amount'=>-8.12),
        4=> array('index'=>12, 'Score'=>"level 10", 'amount'=>16.5)
        // example Raw Data with non-unique levels
    );
    $numOfScores = 15; // Predefined Score Level Max
    foreach($rowData as $c){
        $cols[] = $c['index']; //Create index row
        $score = str_replace("level ","",$c['Score']); // split the score so it is only numeric
        $levels[$score][] = $c; //create a 2-D array based on the level
    }
    echo "<table><tr><th colspan=".(sizeof($cols)+1).">Scores:</th></tr>";
    for($ii = 1; $ii < $numOfScores; $ii++){ // Go through the levels
        echo "<tr><td>Level ".$ii."</td>";
        for($i = 0; $i < sizeof($cols); $i++){
            echo "<td>";
            if(isset($levels[$ii])){ // If I have a level, let's print it in the right column
                foreach($levels[$ii] as $lvl)
                    if($cols[$i] == $lvl['index']) echo $lvl['amount'];
            }
            echo "</td>";
        }
        echo "<tr>";
    }
    echo "<td>Index:</td>";
    foreach($cols as $c){
        echo "<td>$c</td>";
    }
    echo "</table>";
    ?>

I get the following output:

Scores:
Level 1 12.24               
Level 2             -8.12   
Level 3                 
Level 4     14.61           
Level 5                 
Level 6                 
Level 7                 
Level 8                 
Level 9                 
Level 10        42.35       16.5
Level 11                    
Level 12                    
Level 13                    
Level 14                    
Index:  1   3   9   15  12

It is tabbed correctly on my screen, probably won't appear to be.

As you can see, I added an extra row in your data to simulate a non-unique row. Should work!

Jason
Jason. thanks for your effort and the print out. I came up with an elegant solution for this - maybe your solution gave me the seed of the idea. I will accept your answer anyhow. thanks!
skyeagle