Sven Rautenberg: wie kann man das kürzen?

Beitrag lesen

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!