ERLEDIGT
NEIN
NEIN
ANTWORTEN
1
1
ZUGRIFFE
3794
3794
EMPFEHLEN
-
Hatte leider nur grad kurz Zeit (2 Stunden) für die Aufgabe 1.
Als Fragen-Antwort-Quelle dient mir dei Datei von Matthias Reitinger.
Dazu habe ich diese einfache Klasse erstellt
Aufgabe1.php
Code PHP: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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
<?php class Aufgabe1{ const C_DATA_FILE = 'fragen.csv.txt'; /** * Construkter * @param $length Länge des Losungswortes */ public function __construct($length = false){ //Liste einlesen foreach(file(self::C_DATA_FILE) as $id => $entry){ list($this->words[$id], $this->questions[$id]) = explode(';', $entry); } //Losungswort aussuchen //Wenn die Länge mitgegeben wurde, die Wörter aus der Liste nach Wortlänge filtern if ($length !== false && is_numeric($length)) { $words = array_filter($this->words, create_function('$word', "return strlen(\$word) == {$length};")); } else { $words =$this->words; } //Ein beliebiges Wort aus der gefilterten Liste aussuchen $this->myWord = $words[array_rand($words)]; //Die Horizontalen Wörter/Antworten auslesen $this->createAnswers(); //Ausgabe vorbereiten $this->prepareOutput(); } /** * Pro Buchstabe ein Wort definieren */ protected function createAnswers(){ //Pro Buchstabe des Losungswortes ein Wort aussuchen foreach(str_split($this->myWord) as $this->letter){ //Filtern nach dem Buchstaben $selWords = array_filter($this->words, array($this,'filterByLetter')); //Ein zufälliges Wort aussuchen $id = array_rand($selWords); $word = $selWords[$id]; //Nur die Losungsbuchstaben ausfiltern und davon zufällig einen aussuchen $pos = array_rand(array_filter(str_split($word), array($this,'filterByLetter'))); //Antworten speichern $this->answers[] = compact('id', 'word', 'pos'); //Wort aus der Liste entfernen, damit es nicht nochmal gewählt wird unset($this->words[$id]); //'Geometrie' bestimmen $this->maxPos = max($this->maxPos, $pos); $this->length = max($this->length, strlen($word)); } } /** * Aufbereiten der formatierten Ausgabe */ protected function prepareOutput(){ foreach($this->answers as $key => $entry){ $row['nr'] = $key + 1; //Fragen speichern $this->selectedQuestions[] = array('nr' => $row['nr'], 'question' => $this->questions[$entry['id']]); //Links und Rechts die nicht verwedneten Felder ermitteln (colspan) $row['leftLen'] = $this->maxPos - $entry['pos']+1; $row['rightLen'] = $this->length - ($leftLen + strlen($entry['word'])); //Die Quiz-Zeile erstellen $this->quizs[] = self::getFormatedWord($entry['word'], $entry['pos'], $row, false); //Die Lösungszeile erstellen $this->losungen[] = self::getFormatedWord($entry['word'], $entry['pos'], $row, true); } } /** * formatiert das Wort als Tabellenfelder * @param String $word * @param Number $pos * @param Number $row * @param Boolean $asAnswer * @return String */ protected static function getFormatedWord($word, $pos, $row, $asAnswer){ //Array mit allen Buchstaben erstellen. Wenn nicht die Antwort mitgegeben wird, dann leerzeichen $letters = ($asAnswer) ? str_split($word) : array_fill(0, strlen($word), ' '); //Jeder Buchstabe als Tabellenfeld formatieren array_walk($letters, array(self, 'formatLetter'), $pos); //Die Zeilenausgabe um die formatierten Fleder ergänzen $row['word'] = implode($letters); return $row; } /** * Callback-Function um die Buchstaben als Tabellenfeld zu formatieren * @param String $item * @param Number $letterPos * @param Number_type $pos */ protected static function formatLetter(&$item, $letterPos, $pos){ $tag = ($letterPos == $pos) ? 'th' : 'td'; $item = "<{$tag} class='word'>{$item}</{$tag}>"; } /** * Callback-Function für array_filter * @param String $word * @return Boolean */ protected function filterByLetter($word){ return stripos($word, $this->letter) !== false; } } ?>
Dazu ein kleines Template, dass die Ausgabe formatiert
templateAufgabe1.php
Code PHP: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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <!-- Style definitionen --> <style type="text/css"> table, tr { border:1px solid #000;} th { width:25px; background-color:#FFFFCC;} td {width:25px;} .word { border:1px solid #000; align:center; valign:middle;} </style> </head> <body> <h2>Rätsel</h2> <table> <?php foreach($obj->quizs as $row){ ?> <tr> <td><?=$row['nr']; ?>:</td> <td colspan="<?=$row['leftLen']; ?>"> </td> <?=$row['word'];?> <td colspan="<?=$row['rightLen']; ?>"> </td> </tr> <?php } //END $obj->quizs ?> </table> <hr /> <p> <?php foreach($obj->selectedQuestions as $row){ ?> <?=$row['nr'];?>: <?=$row['question'];?><br /> <?php } //END $obj->selectedQuestions ?> </p> <h2>Lösung</h2> <?=$obj->myWord;?> <hr /> <table> <?php foreach($obj->losungen as $row){?> <tr> <td><?=$row['nr']; ?>:</td> <td colspan="<?=$row['leftLen']; ?>"> </td> <?=$row['word'];?> <td colspan="<?=$row['rightLen']; ?>"> </td> </tr> <?php } //END $obj->losungen ?> </table> </body> </html>
Und natürlich noch das index.php, das als Einstieg verwendet wird
index.php
Code PHP: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
<?php /** * Funktion exceptionErrorHandler * Fehlerbehandlung sauber definieren. Alle Errors als Exception ausgeben * @link exceptionErrorHandler.php: [url]http://wiki.yaslaw.info/wikka/PhpErrorsAsExceptions[/url] */ include_once('functions/exceptionErrorHandler.php'); /** * Funktion filterInputDefaults * erweitert filter_input_array um 'default' * @link filterInputDefaults.php: [url]http://wiki.yaslaw.info/wikka/PhpFilterInputDefaults[/url] */ include_once('functions/filterInputDefaults.php'); /** * GET - Definionen * Es ist nur ein Parameter zugellassen. * @param len: Länge des Losungswortes * @example quiz17/index.php?len=5 */ $definition = array('len' => array( 'filter' => FILTER_VALIDATE_INT, 'options' => array('min_range' => 3, 'max_range' => 50), 'default' => false)); $get = filterInputDefaults(INPUT_GET, $definition); //Klasse für die Aufgabe 1 einbinden include_once('Aufgabe1.php'); //Mein Aufgabe1-Objekt anlegen $obj = new Aufgabe1($get['len']); //Ausgabe include_once('templateAufgabe1.php'); ?>
Die 2 Funktionen die ich am Anfang einbinde findet ihr hier
exceptionErrorHandler.php
filterInputDefaults.phpGeändert von Yaslaw (23.08.10 um 15:39 Uhr)
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
Nachtrag:
Hab das ganze mal hochgeladen
(Zufällige Lösungswortlänge
http://yaslaw.info/example/quiz17/
oder mit fixer Lösungswortlänge
http://yaslaw.info/example/quiz17/index&len=9---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
Ähnliche Themen
-
[Quiz#15] yaslaw (PHP)
Von Yaslaw im Forum ArchivAntworten: 0Letzter Beitrag: 07.04.10, 10:07 -
[Quiz#14] yaslaw (PHP)
Von Yaslaw im Forum ArchivAntworten: 0Letzter Beitrag: 26.03.10, 12:44 -
[Quiz#13] Yaslaw (PHP)
Von Yaslaw im Forum ArchivAntworten: 0Letzter Beitrag: 17.01.10, 19:27






Login





