从这个行数据创建HTML表的算法?

时间:2010-10-24 16:50:24

标签: c# php c++ python html

我已经解决了一个相对(几乎)微不足道的问题。我有一行数据要以表格形式(HTML)显示。出于某种原因(可能在计算机后面很长一天),我没有提出任何优雅的解决方案(算法)来做到这一点。

我已经提供了一些示例数据,以及这些数据将如何显示在表格中。我很感激有关algos的一些想法来实现这一点。

输出表的行标有各种分数,索引显示在底部。

我希望能够有一个变量来确定要在下面打印新表之前要打印的列数 - 以防止可疑的长表。

所以我想写一个带有以下签名的函数(忽略数据类型):

function create_table_html_from_rows(datarows,max_cols_per_table)

以下是示例数据和模拟输出表格演示文稿

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

伪代码应该足够了,但是,如果你的代码片段是编程语言,那么值得注意的是我将用Python实现我的算法,但是以下任何语言的任何片段都可以:

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

3 个答案:

答案 0 :(得分:1)

我假设您存储的Raw数据与我下面的数据类似。 此外,该级别是非唯一的。

<?
    $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>";
    ?>

我得到以下输出:

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

我的屏幕上有正确的标签,可能看起来不是。

如您所见,我在数据中添加了一行以模拟非唯一行。应该工作!

答案 1 :(得分:0)

明天是新的一天。这个问题真是微不足道。也不会有优雅的解决方案,只需很长一段时间。

你也可以写出解决方案(不考虑其优点或其他方面),只是为了完成你的工作。之后,您将了解您的思维陷入困境以及如何编写更好的解决方案。

答案 2 :(得分:0)

我会按照以下方式执行此操作(注意:代码未经过测试/调试!):

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