wie kann man das kürzen?
Sorgenkind Mech
- php
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ß
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
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ß
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
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
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
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ß
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
aaaha
doch ich war in der grunsschule, und das is noch nichmal so lange her ;)
haben wir doch wieder was dazugelernt ;)
dankeschön ;)