sortieren nach abc, aber 3 Spalten???
basti
- php
Hallo zusammen!
Ich habe ein Problem.
Aus einer DB werden einige Werte eingelesen und sollen in einer liste mit 3 Spalten ausgegeben werden. Soweit kein Problem. Das Ganze soll nach Alphabet sortiert werden, auch kein Problem.
Nun werden alle einträge aber in 3 Spalten ausgegeben. Nun wird logischerweise nach rechts aufgezählt, also z.b:
a|b|b
c|c|d
d|e|f
g|h|i
usw.
ich hätte die Sortierung aber gerne so:
a|c|d|
b|c|e|
b|d|f|
c|d|g|
für manche "startbuchstaben" gibt es aber mehrere Einträge.
derzeit schaut mein Quellcode so aus (dabei wird wie bei BSP1 sortiert:
<tr>
<?php
$sql="select * from farb where aktiv=1 order by thema";
$ergebnis2=mysql_query($sql);
for($i=0;$i<mysql_num_rows($ergebnis2);$i++)
{
$ergebnis[$i]=mysql_fetch_array($ergebnis2);
}
for($i=0;$i<count($ergebnis);$i++)
{
?>
<td>
<li>
<?php echo "<a href='index.php?page=".$ergebnis[$i]['id']."'>".$ergebnis[$i]['thema']."</a>"; ?>
</li>
</td>
<?php
if (!(($i+1) % 3)){echo "</tr><tr>";}
}
echo "</tr>";
kann mir von euch evtl. jemand helfen, hat jemand nen tipp, oder nen link? wäre super! DANKE
gruß basti
Moin!
ich hätte die Sortierung aber gerne so:
a|c|d|
b|c|e|
b|d|f|
c|d|g|
Wenn du mit dem normalen MySQL-Query arbeitest, speichert PHP die Abfrage in einem für dich jederzeit und _wahlfrei_ lesbaren Speicherbereich. Du kannst also im Prinzip beliebig in der Abfrage herumspringen und die Einträge für die Ausgabe zusammensortieren.
Dabei hast du zwei Problemstellungen:
1. Zugriff auf ein einzelnes Element. Das ist simpel gelöst:
mysql_data_seek() hilft für das Setzen des Zeigers http://www.php.net/manual/de/function.mysql-data-seek.php
mysql_fetch_array() liest dann den gewünschten Datensatz.
2. Du mußt für die Tabelle wissen, wie lang die Spalten werden können. Dazu mußt du herausfinden, wie viele Einträge untereinander gehören. Es ist ein guter Ansatz, einfach die Anzahl der Datensätze durch die Zahl der Spalten zu teilen - mit ein wenig Korrekturfaktor (Was ist, wenn die Zahl nicht direkt durch 3 teilbar ist?) kriegst du das sicher hin.
Und dann bleibt dir nur noch, das alles zusammenzuschütten und in ein Ausgabeskript zu verpacken.
Es ist jedenfalls keine Aufgabenstellung, bei der die Datenbank dir irgendwie helfen könnte.
- Sven Rautenberg
Hi!
Ich würde mit while($row=mysql_fetch_row($result)) die Daten abfragen, und dann in jedem Durchlauf den Array $row mit sort() sortieren und an einen Array anfügen, so dass Du am Ende einen Array mit allen Datensätzen hast. Jetzt musst Du den Array nur noch mit usort() mit einer von Dir zu überlegenden callback-Funktion sortieren, so dass Du das gewünschte Ergebnis erhälst. In der Callback-Funktion musst Du dann halt immer die Elemente des Dastensatzes durchgehen, irgendwie sowas:
function my_callback_sort() {
for($i=0; $i<=count($a); $i++) {
if ($a[$i] != $b[$i]) return ($a[$i] > $b[$i]) ? -1 : 1;
}
return 0;
}
Grüße
Andreas
Hallo basti!
Kann mir nicht vorstellen, dass man die Sortierung nicht gleich in der DB lösen könnte - wie sehen also die Felder aus oder wie kommen die erwähnten drei Spalten in bzw. aus der DB?
mfg
norbert =:-)
Moin!
Kann mir nicht vorstellen, dass man die Sortierung nicht gleich in der DB lösen könnte - wie sehen also die Felder aus oder wie kommen die erwähnten drei
Spalten in bzw. aus der DB?
Das ist aber so. Basti will die Ausgabe nicht zeilenweise haben, sondern spaltenweise. Da man bei solch einer Ausgabeweise aber nicht die Datenbank Element für Element auslesen und in eine HTML-Tabelle schreiben kann, sondern entweder in der HTML-Ausgabe springen oder in der Datenbankabfrage springen muß, ist das schon ein Problem.
Natürlich könnte man es auch durch geeignetes HTML lösen:
<table>
<tr>
<td>
<table>
<tr><td>Datensatz 1</td></tr>
<tr><td>Datensatz 2</td></tr>
<tr><td>Datensatz 3</td></tr>
</table>
</td>
<td>
<table>
<tr><td>Datensatz 4</td></tr>
<tr><td>Datensatz 5</td></tr>
<tr><td>Datensatz 6</td></tr>
</table>
</td>
</tr>
</table>
Das Ergebnis wird wie die gewünschte Tabelle aussehen, und die Datenbank wird linear ausgelesen. Dabei kann man sogar außer Acht lassen, dass die letzte Spalte in der Regel nicht genug Datensätze hat und man, damit die Tabelle, würde sie nicht verschachtelt, aufgeht, noch leere Zellen einfügen müßte.
Hm, bei verschachtelten Tabellen bilde ich anscheinend gerne Schachtelsätze. ;)
- Sven Rautenberg
Hallo Sven!
Verstehe! Aber bevor ich da mit Arrays & Co. anfange, mache ich auch lieber einige verschachtelte Tabellen - wie in deinem Beispiel ...
mfg
norbert =:-)
Hi!
Basti will die Ausgabe nicht zeilenweise haben, sondern spaltenweise.
eu, hatte ich falsch verstanden, vergesst was ich geschrieben habe, ich dachte er wollte die Datensätze nur speziell sortieren.
Grüße
Andreas