Sorgenkind Mech: wie kann man das kürzen?

hallo  nochmal

ich bin im moment überglücklich und mein hirn qualmt aber ich habe es geschafft

folgende routine hat folgende aufgabe:

es werden länderkürzel und dazugehörige ländernamen aus ner db abgerufen

diese werden nun in eine tabelle gepackt und sortiert ausgegeben, spalte für spalte (von der sortierlogik her)
ich kann ja aber die tabelle nur zeile für zeile ausgeben

dafür hab ich jetz ne lösung, würde aber gerne wissen, ob man das auch kürzer/ einfacher hätte machen können

hier die routine:

<table>
 <tr><?php
  $laender=mysql_query("select kuerzel, deutsch from laender ORDER BY deutsch");
  $i=0;
  while($lande=mysql_fetch_assoc($laender))
  {
   $land[$i]['k']=$lande['kuerzel'];
   $land[$i]['d']=$lande['deutsch'];
   $i++;
  }
  $spalten=6;
  $reihen=bcdiv(count($land),$spalten,1);
  if(bcmul($reihen,1,1)!=bcmul($reihen,1,0))
  {
   $reihen=bcmul($reihen,1,0);
   $vollespalten=bcsub(count($land),bcmul($reihen,$spalten,0),0);
   $reihen++;
  }
  else $vollespalten=$spalten;
  $diff=bcsub($spalten,$reihen,0);
  $abzug=0;
  $z=0;
  $i=0;
  $p=0;
  for($k=0;$k<count($land);$k++)
  {
   if($z==$spalten)
   {
    $z=0;
    $i=0;
    $p++;
    $abzug=0;
   }
   if($i>$vollespalten) $abzug++;
   if($z==0) echo "</tr>\n<tr>";
   $index=bcsub(bcsub(bcadd($p,bcmul($spalten,$i,0),0),bcmul($i,$diff,0),0),$abzug,0);

echo "<td><font size=1>".$land[$index]['k']." - </font></td><td><font size=1>".$land[$index]['d']."</font></td>";

$z++;
   $i++;
  }

?></tr></table>

ich hoffe man kann was mit anfangen ;)

gruß

  1. hi,

    es werden länderkürzel und dazugehörige ländernamen aus ner db abgerufen

    diese werden nun in eine tabelle gepackt und sortiert ausgegeben, spalte für spalte (von der sortierlogik her)

    sortiert nach welchen kriterien?
    zuerst nach kuerzel, dann nach deutscherbezeichnung, oder steckt da noch mehr dahinter?

    ansonsten würde ich nämlich einfach sagen, nimm neben "deutsch" auch noch die spalte "kuerzel" als sortier-kriterium in die query auf ...

    gruss,
    wahsaga

    1. nönö

      moin

      also die datenbank besteht nur aus

      kuerzel | deutsch | foreign

      und es wird einfah nach der deutschen bezeichnung des landes sortiert

      und soweit ich weiß gibt es keine 2 länder mit selben namen

      geht mir nur um die routine

      achja: ist meine lösung eigentlich programmiertechnisch gesehen gut oder sehr gut oder vielleicht scheiße?

      würd mich halt einfach mal interessieren weil mir halt sehr der kopf gequlmt hat ;)

      gruß

      1. hi,

        also die datenbank besteht nur aus

        kuerzel | deutsch | foreign

        und es wird einfah nach der deutschen bezeichnung des landes sortiert

        aber eben dies hast du doch schon erreicht, in dem du du
        ORDER BY deutsch
        in deine DB-abfrage mit aufgenommen hast.

        mir ist nicht klar, welche frage sich dir jetzt noch stellt bezüglich der sortierung?

        gruss,
        wahsaga

        1. Hello,

          mir ist nicht klar, welche frage sich dir jetzt noch stellt bezüglich der sortierung?

          Na, diese umwerfende "aus Kreuz mach Quer" Logik

          Mit Tabelle in Tabelle oder mit Listen in DIVs und ein bisschen CSS hätte man das einfacher hinbekommen. Den Rest macht dann der Browser...

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  2. Moin!

    dafür hab ich jetz ne lösung, würde aber gerne wissen, ob man das auch kürzer/ einfacher hätte machen können

    Die spannendste Frage zuerst: Gibt es einen Grund, warum du die bc*-Rechenfunktionen verwendet hast? Weil die normalerweise nur dann eingesetzt werden sollten, wenn man einen Grund dafür hat, und der lautet: Beliebit präzise Zahlen.

    So wie ich das sehe, verwendest du ganz simple Arithmetik ohne irgendeine Spezialität, so dass die Verwendung der simplen Multiplikation (*), Division (/), Addition (+) und Subtraktion (-) vollkommen ausgereicht hätte.

    Abgesehen davon: Deine Leistung besteht augenscheinlich in der überaus komplexen Herumrechnerei, wann den nun die Tabelle in eine neue Zeile gehen soll.

    Dafür rechnest du in der Tat etwas zu heftig herum.

    <table>
     <tr><?php
      $laender=mysql_query("select kuerzel, deutsch from laender ORDER BY deutsch");
      $i=0;
      while($lande=mysql_fetch_assoc($laender))
      {
       $land[$i]['k']=$lande['kuerzel'];
       $land[$i]['d']=$lande['deutsch'];
       $i++;
      }

    Bis hierhin ist es gut. Geht nicht kürzer.

    $spalten=6;

    Auch gut - aber vielleicht (hängt von der Gestaltung der restlichen Skripte etc. ab) mitten im Skript nicht ganz so glücklich untergebracht. Definitionen für einzelne Werte sind ganz zu Beginn toll. Und als Konstante sogar noch besser.

    Und jetzt wird's überflüssig:

    $reihen=bcdiv(count($land),$spalten,1);
      if(bcmul($reihen,1,1)!=bcmul($reihen,1,0))
      {
       $reihen=bcmul($reihen,1,0);
       $vollespalten=bcsub(count($land),bcmul($reihen,$spalten,0),0);
       $reihen++;
      }
      else $vollespalten=$spalten;
      $diff=bcsub($spalten,$reihen,0);
      $abzug=0;
      $z=0;
      $i=0;
      $p=0;
      for($k=0;$k<count($land);$k++)
      {
       if($z==$spalten)
       {
        $z=0;
        $i=0;
        $p++;
        $abzug=0;
       }
       if($i>$vollespalten) $abzug++;
       if($z==0) echo "</tr>\n<tr>";
       $index=bcsub(bcsub(bcadd($p,bcmul($spalten,$i,0),0),bcmul($i,$diff,0),0),$abzug,0);

    echo "<td><font size=1>".$land[$index]['k']." - </font></td><td><font size=1>".$land[$index]['d']."</font></td>";

    $z++;
       $i++;
      }

    Bis hierhin (bis aufs echo, das wird natürlich gebraucht).

    Für die Ausgabe würde ich stattdessen vorschlagen:

    for ($i=0; $i<count($land); $i++)
    {
      echo "<td>".$land[$i]['k']." - </td><td>".$land[$i]['d']."</td>";
      if (($i%$spalten)==5)
      {
        echo "</tr><tr>\n";
      }
    }
    echo str_repeat("<td> </td><td> </td>",($spalten-($i%$spalten)));

    ?></tr></table>

    Ziemlich viel kürzer und wesentlich weniger berechnungsintensiv. :)

    - Sven Rautenberg

    --
    Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
    1. Für die Ausgabe würde ich stattdessen vorschlagen:

      for ($i=0; $i<count($land); $i++)
      {
        echo "<td>".$land[$i]['k']." - </td><td>".$land[$i]['d']."</td>";
        if (($i%$spalten)==5)
        {
          echo "</tr><tr>\n";
        }
      }
      echo str_repeat("<td> </td><td> </td>",($spalten-($i%$spalten)));

      ?></tr></table>

      Ziemlich viel kürzer und wesentlich weniger berechnungsintensiv. :)

      - Sven Rautenberg

      hm .......... aber würde dabei die sortierung der daten nich zeilenweise ablaufen??

      sprich:
      |a|b|c|d|
      |e|f|g|h|

      meine komplizierte methode soll ja folgendes ausgeben:

      |a|c|e|g|
      |b|d|f|h|

      und das halt in beliebiger spaltenanzahl

      vielleicht check ich ja dein vorschlag nich ganz, aber ....

      was bedeutet eigentlich $i%$spalten?
      was passiert dabei?

      danke schonmal für die mühe

      gruß

      1. Moin!

        for ($i=0; $i<count($land); $i++)
        {
          echo "<td>".$land[$i]['k']." - </td><td>".$land[$i]['d']."</td>";
          if (($i%$spalten)==5)
          {
            echo "</tr><tr>\n";
          }
        }
        echo str_repeat("<td> </td><td> </td>",($spalten-($i%$spalten)));

        ?></tr></table>

        hm .......... aber würde dabei die sortierung der daten nich zeilenweise ablaufen??

        sprich:
        |a|b|c|d|
        |e|f|g|h|

        meine komplizierte methode soll ja folgendes ausgeben:

        |a|c|e|g|
        |b|d|f|h|

        Aha.

        Ändere dein HTML passend. Verschachtelte Tabellen sind für deine Ausgabewünsche ziemlich geeignet.

        Alternativ (wenn du wirklich nur eine Tabelle haben willst) kannst du natürlich auch eine angepaßte FOR-Schleife nehmen bzw. darin etwas rumrechnen. Das will ich jetzt aber nicht bis zur Vervollständigung ausführen.

        Oder du liest die Datenbank entsprechend anders aus - niemand schreibt dir vor, dass du die Ergebnisse hintereinander weg in ein Array schreiben mußt, du kannst das Array ja auch so befüllen, dass du hinterher leicht HTML erzeugen kannst.

        was bedeutet eigentlich $i%$spalten?

        Modulo-Operation.

        was passiert dabei?

        x % y: Teile x durch y, das Ergebnis ist der Rest. Schonmal in der Grundschule gewesen? Teilen mit Rest erlebt? Genau das ist es.

        5 % 3 = 2 - die 3 paßt in die 5 einmal hinein, Rest 2. :)

        Modulo ist eine der wichtigsten Operationen in der Computerei, würde ich sagen. Sie wird viel zu wenig beachtet, kann aber zum Verkürzen diverser Probleme genutzt werden.

        - Sven Rautenberg

        --
        Die SelfHTML-Developer sagen Dankeschön für aktuell 20885,68 Euro Spendengelder!
        1. aaaha

          doch ich war in der grunsschule, und das is noch nichmal so lange her ;)

          haben wir doch wieder was dazugelernt ;)

          dankeschön ;)