Fiffi: 2x foreach und formatierte Ausgabe

Guten morgen. Hab mal wieder ne Nacht ohne eine Lösung verbracht.
Ich komme bei folgendem nicht weiter.
Ich includiere 2 Arrays ($zahl und $player)
$zahl hat folgenden Aufbau (können noch zahlen dazu kommen, aber immer unterschiedliche):

$zahl=array(  
array(33),  
array(6),  
array(5),  
array(4),  
array(7),  
array(2),  
array(55),  
);

$player ist so aufgebaut (Values pro array sind immer 10 Stk):

$player=array(  
array('Aas53','1','17','25','7','12','5','33','55','45'),  
array('Arwen7614','5','7','11','77','18','14','99','17','2'),  
array('Baer007','2','77','40','27','15','84','72','61','5'),  
array('Charmingbear007','4','2','15','55','12','6','77','85','7'),  
array('DJ Avalon45','4','1','49','55','7','64','17','41','36'),  
array('DJLiander','11','5','3','8','10','7','25','33','21'),  
array('DJmünstermaus','17','2','7','1','5','52','63','74','5'),  
array('Glücklicher10','54','44','34','14','4','18','5','9','7'),  
array('SaarMikey','5','14','24','4','44','91','5','99','87'),  
);

Nun versuche ich (wie ein Bingo-Blatt), mir eine Tabelle anzeigen zu lassen mit allen Zaheln pro Player. Aber die Zahlen die mit $zahl übereinstimmen, sollen rot formatiert sein.
Mein Versuche schlagen aber alle fehl. Entweder bekomme ich 7x (Anzahl der arrays in $zahl) eine Ausgabe. Oder ich bekomme nur die das letze array aus $zahl in rot.

Mein versuch:

foreach ($player as $value){  
foreach ($zahl as $wert){  
echo "  
<tr>  
  
<td>"; echo $value[0]; echo "</td>  
  
<td align=center>"; if ($value[1]== $wert[0]){echo "<font color=red>".$value[1]."</font>";}  
else {echo "<font color=white>".$value[1]."</font>";}  
echo "</td>  
  
<td align=center>"; if ($value[2]== $wert[0]){echo "<font color=red>$value[2]</font>";}  
elseif ($value[2]!= $wert[0]){echo $value[2];}  
echo "</td>  
  
<td align=center>"; if ($value[3]== $wert[0]){echo "<font color=red>$value[3]</font>";}  
elseif ($value[3]!= $wert[0]){echo $value[3];}  
echo "</td>  
  
<td align=center>"; if ($value[4]== $wert[0]){echo "<font color=red>$value[4]</font>";}  
elseif ($value[4]!= $wert[0]){echo $value[4];}  
echo "</td>  
  
<td align=center>"; if ($value[5]== $wert[0]){echo "<font color=red>$value[5]</font>";}  
elseif ($value[5]!= $wert[0]){echo $value[5];}  
echo "</td>  
  
<td align=center>"; if ($value[6]== $wert[0]){echo "<font color=red>$value[6]</font>";}  
elseif ($value[6]!= $wert[0]){echo $value[6];}  
echo "</td>  
  
<td align=center>"; if ($value[7]== $wert[0]){echo "<font color=red>$value[7]</font>";}  
elseif ($value[7]!= $wert[0]){echo $value[7];}  
echo "</td>  
  
<td align=center>"; if ($value[8]== $wert[0]){echo "<font color=red>$value[8]</font>";}  
elseif ($value[8]!= $wert[0]){echo $value[8];}  
echo "</td>  
  
<td align=center>"; if ($value[9]== $wert[0]){echo "<font color=red>$value[9]</font>";}  
elseif ($value[9]!= $wert[0]){echo $value[9];}  
echo "</td>  
  
</tr>  
  
"; } }
  1. Lieber Fiffi,

    generell scheint Deine Vorgehensweise nicht falsch zu sein.

    $zahl=array(

    array(33),
    array(6),
    array(5),

      
    Warum verpackst Du die Zahlenwerte jeweils in ein Unter-Array? Warum nicht so?  
      
    `$zahl = array (33, 6, 5, 4, 7, 2, 55);`{:.language-php}  
      
    Das hätte später den Vorteil, dass Du nicht mit `$wert[0]`{:.language-php}, sondern nur mit `$wert`{:.language-php} vergleichen musst. Außerdem ist "zahl" ein denkbar schlechter Variablenname, da er nicht sagt, welchen Sinn die Variable hat.  
      
    
    > $player ist so aufgebaut (Values pro array sind immer 10 Stk):  
      
    Aha, und welchen Sinn tragen die jeweiligen Werte?  
      
    
    > ~~~php
    
    $player=array(  
    
    > array('Aas53','1','17','25','7','12','5','33','55','45'),  
    > array('Arwen7614','5','7','11','77','18','14','99','17','2'),
    
    

    Auch ich musste mir einst sagen lassen, dass "sprechende" Indizes grundsätzlich günstiger sind, da man später im Code besser durchblickt. Also in etwa so:

    $player = array (  
        array (  
            'name'             => 'Aas53',  
            'Mut'              => 1,  
            'Geschicklichkeit' => 17,  
            'Charisma'         => 25,  
            'Körperkraft'      => 7,  
            'Magie'            => 12,  
            'Angriff'          => 5,  
            'Verteidigung'     => 33,  
            'Erfahrung'        => 55,  
            'Gold'             => 44  
        ),  
        array (  
            'name'             => 'Arwen7614',  
            'Mut'              => 5,  
            ...  
        )  
    );
    

    Mein versuch:

    foreach ($player as $value){

    foreach ($zahl as $wert){
    echo "
    <tr>

    <td>"; echo $value[0]; echo "</td>

    <td align=center>"; if ($value[1]== $wert[0]){echo "<font color=red>".$value[1]."</font>";}
    else {echo "<font color=white>".$value[1]."</font>";}
    echo "</td>

      
    Also da graust es mich gewaltig.  
    1\.) Keine <font>-Elemente, benutze CSS und class-Attribute um zu gestalten!  
    2\.) Da steigt kein Mensch durch die Syntax. Benutze [sprintf()](http://de3.php.net/manual/de/function.sprintf.php)!  
      
    ~~~php
    $html = '<table class="playerlist">'."\r\n";  
    foreach ($player as $_player) {  
        $html .= '<tr>';  
        foreach ($zahl as $_zahl) {  
            foreach ($_player as $eigenschaft => $wert) {  
                $html .= sprintf(  
                    '<td%s>%s: %02d</td>',  
                    ($wert == $zahl ? ' class="besonders"' : ''),  
                    $eigenschaft,  
                    $wert  
                );  
            }  
        }  
        $html .= "</tr>\r\n";  
    }  
    $html .= "</table>\r\n";
    

    Wie Du siehst, habe ich die innere Struktur eines jeweiligen Players dazu benutzt, den Aufbau einer Zabellenzeile mittels einer Schleife zu erzeugen. Die Einfärbung geschieht mittels CSS, in welchem der Klasse "besonders" bestimmte Darstellungseigenschaften zugewiesen werden können. Damit kann dann das Aussehen unabhängig vom PHP-Code gesteuert werden, will heißen: Wenn es nicht mehr rot, sondern fett-kursiv-graublau sein soll, dann musst Du den PHP-Code nicht mehr anfassen.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Huhutzzz,

      Warum verpackst Du die Zahlenwerte jeweils in ein Unter-Array? Warum nicht so?

      $zahl = array (33, 6, 5, 4, 7, 2, 55);

      naja. ich dachte, da ich immer value[0] anspreche wäre der Aufbau ok.

      $player ist so aufgebaut (Values pro array sind immer 10 Stk):

      Aha, und welchen Sinn tragen die jeweiligen Werte?

      value[0] ist immer ein Name und die anderen bis value[9] sind Zahlen auf dem Bingo-Schein. Ich wollte das auf 9 Zahlen beschränken pro Spieler.

      Auch ich musste mir einst sagen lassen, dass "sprechende" Indizes grundsätzlich günstiger sind, da man später im Code besser durchblickt.

      Oha..... genau in diesem Punkt hab ich Nachholbedarf :-)

      Aber ich werde deinen Ansatz gleich mal anwenden und guggen was dann passiert.
      Schon mal dankeeeeee

      1. Leider bin ich zu unerfahren um deinen Ansatz umzusetzen.

        Gibt es denn keine andere Möglichkeit, aufbauend auf meinn ursprünglichen Arrays?

    2. Hi!

      $player ist so aufgebaut (Values pro array sind immer 10 Stk):
      Aha, und welchen Sinn tragen die jeweiligen Werte?

      Es geht um Bingo. Da sind es einfach nur Zahlen, ohne Bedeutung.

      $player=array(

      array('Aas53','1','17','25','7','12','5','33','55','45'),
      array('Arwen7614','5','7','11','77','18','14','99','17','2'),

      
      > Auch ich musste mir einst sagen lassen, dass "sprechende" Indizes grundsätzlich günstiger sind, da man später im Code besser durchblickt. Also in etwa so:  
        
      Man muss es aber nicht übertreiben, obwohl du vermutlich nur den Einsatzzweck übersehen hast. Deswegen wäre es eher sinnvoll, das Array so aufzubauen:  
        
      ~~~php
      $players = array(  
        'Aas53' => array('1','17','25','7','12','5','33','55','45'),  
        'Arwen7614' => array('5','7','11','77','18','14','99','17','2'),  
        ...  
        );
      

      Das setzt voraus, dass die Spielernamen jeweils nur einmal vorkommen. Ansonsten könnte man das noch so aufbauen:

      $players = array(  
        array(  
          'name' => 'Aas53',  
          'zahlen' => array('1','17','25','7','12','5','33','55','45')),  
        array(  
          'name' => 'Arwen7614',  
          'zahlen' => array('5','7','11','77','18','14','99','17','2')),  
        ...  
        );
      

      Das ist dann aber beim Zugriff wieder etwas komplexer.

      foreach ($player as $_player) {
          foreach ($zahl as $_zahl) {
              foreach ($_player as $eigenschaft => $wert) {

      Zu umständlich. Du hast doch das Array der gezogenen Zahlen schon vereinfacht. Darüber muss man nicht mehr iterieren sondern nur noch die Zahlen des Spieler daraufhin untersuchen, ob sie darin vorkommen: in_array()

      Die Einfärbung geschieht mittels CSS, in welchem der Klasse "besonders" bestimmte Darstellungseigenschaften zugewiesen werden können.

      Im vorliegenden Bingo-Fall wäre wohl eher "gezogen" angebracht.

      Es ist immer besser die einfachste Lösung[*] zu wählen - nur muss man erstmal drauf kommen.

      [*] Einfach, aber auch vollständig, inklusive Fehlerbehandlung und anderer notwendiger Infrastruktur.

      Lo!

      1. Hallo Lo,

        Deswegen wäre es eher sinnvoll, das Array so aufzubauen:

        $players = array(

        'Aas53' => array('1','17','25','7','12','5','33','55','45'),
          'Arwen7614' => array('5','7','11','77','18','14','99','17','2'),
          ...
          );

        
        >   
        > Das setzt voraus, dass die Spielernamen jeweils nur einmal vorkommen.  
        >   
        
        Hab es so aufgebaut. Spielernamen gibt es nur 1x  
          
        Das array der gezogenen Zahlen ist nun so:  
        `$zahl = array (33,6,5,4,7,2,55);`{:.language-php}  
          
        So sieht leider mein Ergebnis immer noch aus:  
        http://connormcleod.saarmikey.de/bingo/  
          
        Es soll doch nur pro Spieler eine Reihe mit seinem Bingo-Zettel angezeigt werden. Wobei die gezogenen Zahlen `$zahl`{:.language-php} eben in Rot da stehen.  
          
        Ich verzweifle noch :-(
        
        1. Hi!

          $players = array(

          'Aas53' => array('1','17','25','7','12','5','33','55','45'),
            'Arwen7614' => array('5','7','11','77','18','14','99','17','2'),
            ...
            );

          
          > Hab es so aufgebaut. Spielernamen gibt es nur 1x  
            
          Gut, dann ist diese obige einfache Form sehr gut geeignet.  
            
          
          > Es soll doch nur pro Spieler eine Reihe mit seinem Bingo-Zettel angezeigt werden. Wobei die gezogenen Zahlen `$zahl`{:.language-php} eben in Rot da stehen.  
            
          Iteriere über das $players-Array. Im Key steht der Name des Spielers im Value ein Array mit seinen Zahlen. Iteriere über die Zahlen und prüfe jeweils, ob sie im Array der gezogenen Zahlen enthalten ist oder nicht. Eine dafür geeignete Funktion ist in\_array() - hab ich ja schon genannt.  
            
            
          Lo!
          
          1. Hallöchen Lo,

            mein derzeitiges Ergebnis mit in_array , sieht nun so aus:
            http://connormcleod.saarmikey.de/bingo/

            Iteriere über das $players-Array. Im Key steht der Name des Spielers im Value ein Array mit seinen Zahlen. Iteriere über die Zahlen und prüfe jeweils, ob sie im Array der gezogenen Zahlen enthalten ist oder nicht. Eine dafür geeignete Funktion ist in_array() - hab ich ja schon genannt.

            »»

            Ich hab es so gemacht:

              
            foreach ($player as $key => $value)  
            {  
            echo "<tr><td>$key</td>";  
              
            foreach ($zahl as $kii => $val)  
              {  
              
            if(in_array($val,$value))  
                {  
            echo "<td align=center><font color=red />$val</td>";  
                }  
              }  
            }  
            echo "  
            </tr>  
            </table>  
            ";  
            
            

            Okay, die Übereinstimmung wird nun rot angezeigt. Würde ja auch reichen um die Zahlen zu prüfen. Aber........
            welche Abfrage brauch ich noch, um mir die noch offenen Zahlen pro Spieler in weiss anzeigen zu lassen?
            Da stehe ich nun völlig auf dem Schlauch.

            1. Lieber Fiffi,

              foreach ($player as $key => $value)

              {
              echo "<tr><td>$key</td>";

              foreach ($zahl as $kii => $val)
                {

              if(in_array($val,$value))
                  {
              echo "<td align=center><font color=red />$val</td>";
                  }
                }
              }
              echo "
              </tr>
              </table>
              ";

                
              jetzt sieht das Ganze schon etwas übersichtlicher aus. Was aber noch immer schlecht ist (ich meine ernsthaft "schlecht"!), sind Deine <font>-Elemente. Nutze Klassen! Zudem ist ein echo nicht immer sinnvoll. Gewöhne Dir an, Ausgaben an den Browser erst am Ende des Scripts zu machen. Warum das sinnvoll und wichtig ist, mag sich Dir jetzt vielleicht noch nicht erschließen, aber spätestens wenn Du einmal mit Sessions arbeitest, wirst Du ganz schnell merken, dass echo-Anweisungen im Script eine heikle Sache sind.  
                
              Außerdem sind deine Variablennamen noch immer nichtssagend. Vergleiche:  
                
              ~~~php
              $html = '<table class="tippuebersicht">'."\r\n"  
                  . '<tr><th>Name</th><th>1</th><th>2</th><th>3</th><th>4</th>'  
                  . "<th>5</th><th>6</th><th>7</th><th>8</th><th>9</th></tr>\r\n";  
                
              foreach ($alle_player as $player) {  
                  $html .= '<tr>';  
                
                  // wir brauchen exakt 10 Tabellenzellen - immer!  
                  for ($i = 0; $i < 10; $i++) {  
                
                      if ($i < 1) {  
                          // Namensspalte:  
                          $html .= sprintf(  
                              '<th>%s</th>', // wir wollen Tabellenüberschriften!  
                              htmlspecialchars($player[$i]) // Daten kontextgerecht encodieren!  
                          );  
                
                      } else {  
                          // Spalten mit den getippten Zahlen  
                          if (isset($player[$i])) { // Zahl überhaupt getippt?  
                              $html .= sprintf(  
                                  '<td%s>%s</td>',  
                                  (in_array($player[$i], $gezogene_zahlen) ? ' class="treffer"' : ''),  
                                  htmlspecialchars($player[$i])  
                              );  
                
                          } else {  
                              $html .= '<td class="ungetippt">&nbsp;</td>';  
                          }  
                
                      }  
                  }  
                
                  $html .= "</tr>\r\n";  
              }  
                
              $html .= "</table>\r\n";  
                
              // ausgeben  
              echo $html;
              

              welche Abfrage brauch ich noch, um mir die noch offenen Zahlen pro Spieler in weiss anzeigen zu lassen?
              Da stehe ich nun völlig auf dem Schlauch.

              Mit isset() kann man das Vorhandensein von Variablen/Objekten/Array-Indizes abfragen. Verwendung siehe oben.

              Du hast mir noch immer keine Rückmeldung zur visuellen Gestaltung mit CSS gemacht. Warum? Wie Du siehst, vergibt mein Code Klassen, anstatt unsinnige <font>-Elemente einzusetzen. Damit kann man später die tollsten gestalterischen Effekte erreichen, ohne auch nur ein Schnipselchen Code in PHP zu verändern!

              Liebe Grüße,

              Felix Riesterer.

              --
              ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
              1. Lieber Felix,
                auch dir ein Dank das Du dich mit reinhängst.

                Du hast mir noch immer keine Rückmeldung zur visuellen Gestaltung mit CSS gemacht. Warum?

                Ich hab noch nie mit CSS gearbeitet. Geschweige CSS mit PHP :-(

                Daher hab ich deinen Lösungsweg nicht der Darstellung nicht gewählt.

                Auch in PHP bin ich erst ein Anfänger, obwohl ich seit einem Jahr mich damit beschäftige.

                Natürlich werde ich deinen neuen Vorschlag ausprobieren.

                1. Lieber Fiffi,

                  Ich hab noch nie mit CSS gearbeitet. Geschweige CSS mit PHP :-(

                  aha! Das ist doch eine wesentliche Erkenntnis! Also helfe ich Dir noch ein bisschen mit CSS weiter.

                  Wenn mein obiger Code funktioniert (ich habe ihn nicht getestet!), dann hast Du ein Dokument, in dem gewisse Elemente eine Klasse haben. Dabei setze ich jetzt voraus, dass Du meinen Code dahingehend erweiterst, dass der Browser am Ende ein vollständiges HTML-Dokument erhält!

                  Diese Klassenzugehörigkeit kann man in CSS aufgreifen und <http://de.selfhtml.org/css/formate/anzeige/divspan.htm@title=für die Darstellung nutzen>. Dazu brauchst Du nun eine CSS-Datei (ist eine gewöhnliche Textdatei mit CSS-Code), die Du am besten in einem eigenen CSS-Verzeichnis ablegst.

                  /bingo/
                   |
                   +--css/
                   |   |
                   |   +-- screen.css
                   |
                   +--images/
                   |   |
                   |   +-- bild.jpg
                   |
                   +--bingo.php

                  Wenn Du in Deinem HTML-Dokument diese <http://de.selfhtml.org/css/formate/einbinden.htm#separat@title=externe CSS-Datei einbindest>, dann kann der Browser diese Darstellungsanweisungen nutzen und an Deinen Elementen umsetzen. Das hat den unschätzbaren Vorteil, dass die Angaben zum Aussehen nicht im HTML-Code stehen.

                  Was muss nun in die CSS-Datei? Ich helfe Dir:

                  table.tippuebersicht {  
                  	border: 1px solid black;  
                          border-collapse: collapse;  
                  }  
                  .tippuebersicht th,  
                  .tippuebersicht td {  
                  	border: 1px solid black;  
                  }  
                  .treffer {  
                  	color: red;  
                  }  
                  .ungetippt {  
                  	background: white;  
                  }
                  

                  Wenn Du die CSS-Datei mit diesem Inhalt angelegt hast, und wenn Du sie dann im Dokument korrekt referenzierst, dann wird die Darstellung im Browser ganz schnell sehr eindeutig. Probier's aus!

                  Liebe Grüße,

                  Felix Riesterer.

                  --
                  ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                  1. Huhuuuu Felix :-)

                    Was muss nun in die CSS-Datei? Ich helfe Dir:

                    Klasse. Hab es umgesetzt. Mein Ergebnis sieht nun so aus:
                    http://connormcleod.saarmikey.de/bingo/

                    Wenn wir noch die Namen in Spalte 1 bekommen, dann hast Du mich glücklich gemacht. Und............ ich hab dank Deiner/Eurer Hilfe wieder was dazu gelernt :-)

                    1. Lieber Fiffi,

                      Klasse. Hab es umgesetzt. Mein Ergebnis sieht nun so aus:
                      http://connormcleod.saarmikey.de/bingo/

                      schon viel besser. Sollte Dir später einfallen, dass Du die Rahmenfarbe und die Hintergrundfarbe der Zellen mit Treffern ändern möchtest, dann tust Du das nicht im PHP-Script, sondern im CSS-Code. Da weiß man dann besser, wo man was drehen und schrauben muss.

                      Wenn wir noch die Namen in Spalte 1 bekommen

                      Wie sieht denn Deine Array-Struktur aus? Ich war davon ausgegangen, dass $alle_player so aufgebaut ist:

                      $player = array(

                      array('Aas53','1','17','25','7','12','5','33','55','45'),
                      array('Arwen7614','5','7','11','77','18','14','99','17','2'),
                      array('Baer007','2','77','40','27','15','84','72','61','5'),

                      [...]

                      );

                        
                      Im Übrigen hat es keinen Sinn die getippten Zahlen in Anführungszeichen zu setzen. Es wird in PHP intern ja doch jede Zahl umgewandelt, wenn sie verglichen werden sollen. Daher kannst Du auch die Zahlen als Integer notieren:  
                        
                      
                      > ~~~php
                      
                      $alle_player = array(  
                          array('Aas53',      1, 17, 25,  7, 12,  5, 33, 55, 45),  
                          array('Arwen7614',  5,  7, 11, 77, 18, 14, 99, 17,  2),  
                          array('Baer007',    2, 77, 40, 27, 15, 84, 72, 61,  5),  
                      [...]  
                      
                      > );
                      
                      

                      Poste doch den nun von Dir verwendeten PHP-Code! Dann sieht man, warum die Anzeige der Player-Namen nicht geklappt hat.

                      Liebe Grüße,

                      Felix Riesterer.

                      --
                      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
                      1. Lieber Fiffi,

                        Wie sieht denn Deine Array-Struktur aus? Ich war davon ausgegangen, dass $alle_player so aufgebaut ist:

                        $player = array(

                        array('Aas53','1','17','25','7','12','5','33','55','45'),
                        array('Arwen7614','5','7','11','77','18','14','99','17','2'),
                        array('Baer007','2','77','40','27','15','84','72','61','5'),
                        [...]
                        );

                          
                        Hab das array der Spieler gerade so umgebaut. Nun geht es auch. Jippeyyyyyyyy  
                          
                        
                        >   
                        > Im Übrigen hat es keinen Sinn die getippten Zahlen in Anführungszeichen zu setzen. Es wird in PHP intern ja doch jede Zahl umgewandelt, wenn sie verglichen werden sollen. Daher kannst Du auch die Zahlen als Integer notieren:  
                        >   
                          
                        Ich gugg mal :-)  
                          
                        Aber nu gehts es siehe hier:  
                        http://connormcleod.saarmikey.de/bingo/  
                          
                        Danke dir nochmals gaaaanz dolle Felix  
                          
                        
                        
                        1. Hallöchen Felix,

                          Im Übrigen hat es keinen Sinn die getippten Zahlen in Anführungszeichen zu setzen. Es wird in PHP intern ja doch jede Zahl umgewandelt, wenn sie verglichen werden sollen. Daher kannst Du auch die Zahlen als Integer notieren:

                          Hab ich gemacht :-)

                          Es ist vollbracht. Klar fehlen noch ein paar Dinge.

                          Zumal ich den Admin-Bereich noch schützen werde :-)

                          Aber die von mir gewünschte Funktion wird nun, dank deiner Unterstützung, nun ausgeführt.

                          Zum Einen, wird (wenn eine Zahl schon da ist) das Script abgebrochen.

                          Zum Anderen wird die neue Zahl (wenn sie noch nicht existiert) in das Array $gezogene_zahlen geschrieben und dann der Vergleich ausgeführt.

                          Zum testen:

                          http://connormcleod.saarmikey.de/bingo

                          Ich lass die Seite noch paar Tage offen, falls jemand Interesse hat :-)

                          Ein großes Dankeschön an Felix. Aber auch an alle Anderen die sich hier reingehängt hatten.

                      2. Hi!

                        Wie sieht denn Deine Array-Struktur aus? Ich war davon ausgegangen, dass $alle_player so aufgebaut ist:

                        $player = array(

                        array('Aas53','1','17','25','7','12','5','33','55','45'),
                        array('Arwen7614','5','7','11','77','18','14','99','17','2'),
                        array('Baer007','2','77','40','27','15','84','72','61','5'),
                        [...]
                        );

                          
                        Diese Version ist nicht besonders sinnvoll, weil sie alle Daten in einen großen Topf wirft und damit quasi nicht normalisiert ist. Wenn man den [Player-Namen als Key](https://forum.selfhtml.org/?t=201970&m=1363390) verwendet, lässt sich ohne die nullte Stelle beachten zu müssen mit einem einfachen foreach über die Zahlen iterieren.  
                          
                        ~~~php
                        foreach ($all_players as $player => $numbers)  
                          echo htmlspecialchars($player); // oder etwas dergleichen  
                          foreach ($numbers as $number)  
                            printf('<td class="%s">%s</td>', in_array($number, $selected_numbers) ? 'treffer' : 'ungetippt', $number);
                        

                        Unter der Annahme, dass die Zahlen als Typ integer und nicht als string gespeichert sind, also ohne Anführungszeichen notiert werden und auch nicht aus Formulardaten und ähnlichen externen Quellen kommen, benötigt die printf()-Zeile kein htmlspecialchars().

                        Lo!

                        1. Hallo Lo,

                          ich habe auch deine Version getestet. Gefällt mir besser, da ich so $player und $number perfekt sortieren kann :-)

                          [code lang=php]foreach ($all_players as $player => $numbers)
                            echo htmlspecialchars($player); // oder etwas dergleichen
                            foreach ($numbers as $number)

                          Unter der Annahme, dass die Zahlen als Typ integer und nicht als string gespeichert sind, also ohne Anführungszeichen notiert werden und auch nicht aus Formulardaten und ähnlichen externen Quellen kommen, benötigt die printf()-Zeile kein htmlspecialchars().

                          Die Zahlen der jeweiligen Spieler werde ich per Formular später noch eingeben. Da kann ich ja festlegen wie sie dann gespeichert werden ;)

                          Gruss Fiffi

                          1. Hi!

                            Die Zahlen der jeweiligen Spieler werde ich per Formular später noch eingeben. Da kann ich ja festlegen wie sie dann gespeichert werden ;)

                            Sie kommen dann grundsätzlich als String beim Script an. Wenn du da keine Typkonvertierung nach Integer erzwingst oder anderweitig sicherstellst, dass nur Ziffern enthalten sind, wirst du dir Gedanken über htmlspecialchars() machen müssen.

                            Lo!

                            1. Guten Morgen Lo

                              Sie kommen dann grundsätzlich als String beim Script an. Wenn du da keine Typkonvertierung nach Integer erzwingst oder anderweitig sicherstellst, dass nur Ziffern enthalten sind, wirst du dir Gedanken über htmlspecialchars() machen müssen.

                              Ich lasse per js nur zahlen zu im Formular  :-)

                              Nur stehe ich leider genau da vor einem anderen Problem.

                              Wenn ich die $alle_player edidieren will per Form, klappt das ja auch mit den Namen (also mit dem Key).

                              Aber die dazugehörigen Values kommen alle an !!
                              Formular (Auszug):

                              foreach ($alle_player as $player => $numbers) {  
                                
                              echo "<tr><td><input name=name[] value=\"$player\"></input></td>";  
                                
                              foreach ($numbers as $number) {  
                                
                              echo "  
                              <td size=\"1\"><input name=\"z[]\" size=\"2\" value=\"$number\"></input></td>  
                              ";  
                                
                              }
                              

                              Per GET kriege ich bei dem Versuch zwar die Key korrekt aber nicht die dazu gehörigen Zahlen:

                              if ($_GET['submit']) // wenn Absenden gedrückt  
                              {  
                              $write .="<?php \n";  
                              $write .="\$alle_player=array(\n";  
                                
                              foreach ($_GET['name'] as $key =>$name){  
                              $write .="'".$name . "'=>array(\n";  // name klappt schon  
                              foreach ($_GET['z'] as $key =>$zahl){  
                                
                              $write .=$zahl."\n";   // klappt nicht  
                              }  
                              }  
                              $write .=");\n?>";
                              

                              Ich mach bestimmt wieder einen Fehler in der foreach-Schleife :-)

                              1. Hi!

                                Ich lasse per js nur zahlen zu im Formular  :-)

                                Javascript läuft auf dem Client und kann beliebig manipuliert werden. Auch ist das Eintreffen von Request bei dir nicht abhängig von Javascript-Code auf der Client-Seite. Du kannst also trotz clientseitiger Prüfung beliebige Werte gesendet bekommen. Eine clientseitige Prüfung kann ein Komfort für Anwender sein, weil sie ohne einen Roundtrip ein Problem gemeldet bekommen, es darf aber niemals die einzige Prüfung sein, wenn einem das eigene System lieb ist.

                                Wenn ich die $alle_player edidieren will per Form, klappt das ja auch mit den Namen (also mit dem Key).
                                Aber die dazugehörigen Values kommen alle an !!
                                Per GET kriege ich bei dem Versuch zwar die Key korrekt aber nicht die dazu gehörigen Zahlen:

                                Dann musst du für Eindeutigkeit sorgen. Als einziges Kriterium das dir eine Auskunft über die Art der Daten liefert hast du den Namen der Formularelemente. Schreib da auch die Zugehörigkeit rein. Um Werte in $_GET/$_POST in einem einfachen oder verschachtelten Array zu bekommen, kann man nicht nur ein oder mehrere []-Paare notieren, man kann da hinein auch den gewünschten Key vorgeben: <input type=... name="zahlen[playername][]">

                                Schau dir mit var_dump() oder print_r() an, was du nun in $_GET/$_POST bereitgestellt bekommst, dann sollte das Prinzip klar sein.

                                Beachte, dass du auch den Playernamen kontextgerecht behandeln muss, damit solche Typen wie Little Bobby Tables keinen Schaden anrichten. Hier hilft nicht nur htmlspecialchars(), auch die []-Klammern musst du berücksichtigen. Mir ist dafür kein offizieller Escape-Mechanismus bekannt, aber beispielsweise eine URL-Kodierung kannst du dafür nehmen.

                                Lo!

                                1. Hallo Lo,
                                  sorry das ich erst so spät antworte aber ich konnte aus pers. Gründen nicht ehr.

                                  Dann musst du für Eindeutigkeit sorgen. Als einziges Kriterium das dir eine Auskunft über die Art der Daten liefert hast du den Namen der Formularelemente. Schreib da auch die Zugehörigkeit rein. Um Werte in $_GET/$_POST in einem einfachen oder verschachtelten Array zu bekommen, kann man nicht nur ein oder mehrere []-Paare notieren, man kann da hinein auch den gewünschten Key vorgeben: <input type=... name="zahlen[playername][]">

                                  Danke für den Tip. Damit konnte ich mein Problem lösen und mein Projekt weiter vorantreiben

                                  Gruss Fiffi

                  2. @@Felix Riesterer:

                    nuqneH

                    Dazu brauchst Du nun eine CSS-Datei (ist eine gewöhnliche Textdatei mit CSS-Code), die Du am besten in einem eigenen CSS-Verzeichnis ablegst.

                    Warum sollte man für eine CSS-Datei ein eigenes Verzeichnis anlegen? Die ist im Webroot-Verzeichnis doch auch gut aufgehoben.

                    Qapla'

                    --
                    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                    (Mark Twain)
                    1. Lieber Gunnar,

                      Warum sollte man für eine CSS-Datei ein eigenes Verzeichnis anlegen? Die st im Webroot-Verzeichnis doch auch gut aufgehoben.

                      das kommt ganz auf die Größe und Struktur der Webpräsenz an. Sicherlich ist für eine kleinere Seite ein extra CSS-Verzeichnis unsinnig, für größere Seiten, die vielleicht noch einen Bearbeitungsbereich haben, ist es bestimmt nicht unsinnig.

                      Liebe Grüße,

                      Felix Riesterer.

                      --
                      ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            2. Hi!

              foreach ($player as $key => $value)
              foreach ($zahl as $kii => $val)

              welche Abfrage brauch ich noch, um mir die noch offenen Zahlen pro Spieler in weiss anzeigen zu lassen?

              Lies bitte noch einmal genau, was ich schrieb. Ich sagte, dass du über die Zahlen des Spielers iterieren sollst und die auf Vorhandensein mit den gezogenen überprüfen sollst, nicht umgekehrt.

              Lo!

              1. Hi!

                Ich sagte, dass du über die Zahlen des Spielers iterieren sollst und die auf Vorhandensein mit den gezogenen überprüfen sollst, nicht umgekehrt.

                "Vorhandensein in der Liste der gezogenen" sollte das werden.

                Lo!

              2. Hallöchen Lo,

                foreach ($player as $key => $value)
                foreach ($zahl as $kii => $val)

                Lies bitte noch einmal genau, was ich schrieb. Ich sagte, dass du über die Zahlen des Spielers iterieren sollst und die auf Vorhandensein mit den gezogenen überprüfen sollst, nicht umgekehrt.

                Ich hoffe ich nerve euch nicht zu dolle, aber meine Kenntnisse bei foreach sind ehr rudimentär.
                Natürlich suche ich nach Beispielen in der PHP-Doku und versuche diese zu nutzen.

                Ich war ja schon froh das (nach ca 3 Stunden) endlich das in_array funktionierte. :-)

        2. Lieber Fiffi,

          Ich verzweifle noch :-(

          nana na, nur jetzt nicht aufgeben! Du kannst das! Nocheinmal ganz entspannt zurücklehnen und die Sache in Ruhe durch den Kopf gehen lassen. Die Lösung ist nicht schwer, nur ungewohnt.

          Manchmal hilft es auch, wenn man zu Stift und Papier greift, um sich die Vorgänge schematisch aufzuzeichnen... auch wenn das uncool ist. ;-)

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)