tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
3794
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.190
    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), '&nbsp;');
            //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']; ?>">&nbsp;</td>
                            <?=$row['word'];?>
                        <td colspan="<?=$row['rightLen']; ?>">&nbsp;</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']; ?>">&nbsp;</td>
                            <?=$row['word'];?>
                        <td colspan="<?=$row['rightLen']; ?>">&nbsp;</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.php
    Geä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

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.190
    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

Thema nicht erledigt

Ähnliche Themen

  1. [Quiz#15] yaslaw (PHP)
    Von Yaslaw im Forum Archiv
    Antworten: 0
    Letzter Beitrag: 07.04.10, 10:07
  2. [Quiz#14] yaslaw (PHP)
    Von Yaslaw im Forum Archiv
    Antworten: 0
    Letzter Beitrag: 26.03.10, 12:44
  3. [Quiz#13] Yaslaw (PHP)
    Von Yaslaw im Forum Archiv
    Antworten: 0
    Letzter Beitrag: 17.01.10, 19:27