2 Stimmen

Ein Algorithmus zur Erstellung einer HTML-Tabelle aus diesen Zeilendaten?

Ich bin an einem relativ (fast) trivialen Problem gescheitert. Ich habe eine Reihe von Daten, die ich in tabellarischer Form (HTML) anzeigen möchte. Aus irgendeinem Grund (möglicherweise ein langer Tag [wieder] hinter dem Computer) fallen mir keine eleganten Lösungen (Algorithmen) dafür ein.

Ich habe einige Beispieldaten vorgelegt, und wie solche Daten in der Tabelle angezeigt werden würden. Ich wäre dankbar für einige Ideen zu Algos, um dies zu implementieren.

In der Ausgabetabelle sind die Zeilen mit den verschiedenen Punktzahlen beschriftet und die Indizes werden am unteren Rand angezeigt.

Ich würde gerne eine Variable haben, die die Anzahl der zu druckenden Spalten bestimmt, bevor eine neue Tabelle darunter gedruckt wird - um lächerlich lange Tabellen zu vermeiden.

Ich möchte also eine Funktion mit der folgenden Signatur schreiben (ohne Berücksichtigung der Datentypen):

function create_table_html_from_rows(datarows, max_cols_per_table)

Hier sind die Beispieldaten und die Präsentation der Mustertabelle

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 sollte ausreichen, aber wenn Sie ein Snippet in einer Programmiersprache haben, ist es vielleicht wert, darauf hinzuweisen, dass ich meinen Algorithmus in Python implementieren werde, aber jedes Snippet in einer der folgenden Sprachen wäre gut:

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

1voto

Jason Punkte 3327

Ich gehe davon aus, dass Sie Rohdaten gespeichert haben, ähnlich wie ich es unten getan habe. Außerdem ist die Ebene nicht eindeutig.

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

Ich erhalte die folgende Ausgabe:

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

Auf meinem Bildschirm ist die Registerkarte korrekt eingeblendet, wahrscheinlich wird sie nicht so aussehen.

Wie Sie sehen können, habe ich eine zusätzliche Zeile in Ihren Daten hinzugefügt, um eine nicht eindeutige Zeile zu simulieren. Das sollte funktionieren!

0voto

Lavir the Whiolet Punkte 1006

Morgen ist ein neuer Tag. Das Problem ist wirklich trivial. Es kann auch keine elegante Lösung geben, nur eine lange.

Sie können auch selbst eine Lösung schreiben (ohne Rücksicht auf ihre Eleganz oder anderes), um Ihre Arbeit zu erledigen. Und danach werden Sie Ideen bekommen, wo Ihre Gedanken stecken geblieben sind und wie Sie eine bessere Lösung programmieren können.

0voto

Kel Punkte 7510

Ich würde es folgendermaßen machen (Hinweis: Der Code ist überhaupt nicht getestet / debugged!):

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X