Sigbert Helle wrote:
> Am 21.02.2015 um 17:06 schrieb Thomas 'PointedEars' Lahn:
>> Was ist hier Vor-, was Nachname?
> Vorne steht der Vorname, danach kommt der Nachname ...
Dann ist Dein Beispiel fhcsal sortiert.
>> Ja. Wie sieht Dein Ansatz und wie sehen Deine Lösungsversuche im
>> *Quelltext* aus?
> Na ja so etwa:
>
> $q = "SELECT Vorname, Nachname FROM ".tblLeute." ORDER BY Nachname";
> und dann das übliche:
> $result = mysql_query($q);
> $number = mysql_numrows($result);
> $row = mysql_fetch_array($result);
> $Vorname = $row[Vorname];
> $Nachname ...
Die mysql_*-Funktionen aus der mysql-Erweiterung sind veraltet und sollten
nicht mehr verwendet werden. Stattdessen solltest Du mysqli oder PDO_mysql
verwenden (ich empfehle Letzteres, auch da PDO aufgrund der grundsätzlich
DB-unabhängigen Schnittstelle den späteren Wechsel zu einem anderen DBMS
erleichtert):
<
http://php.net/mysql_query>
<
http://php.net/mysql_num_rows>
<
http://php.net/mysql_fetch_array>
<
http://php.net/manual/en/mysqlinfo.api.choosing.php>
> print $Vorname." ".$Nachname;
>
> Und vorher müsste ich jetzt mit einer WHERE-Klausel 26 mal den
> jeweiligen Anfangsbuchstaben nehmen.
>
> print "A";
> print $Vorname." ".$Nachname;
> ...
> print "B";
> print $Vorname." ".$Nachname;
>
>
>
> Falls da nicht jemand eine nette Vereinfachungsidee hat, werde ich das
> auch so machen.
Erstens solltest Du es vermeiden, “print” oder “echo” nacheinander
auszuführen. Für so etwas gibt es implode(), ausserdem Templates.
Zweitens reicht “print” nicht aus: “print” generiert nicht automatisch einen
Zeilenumbruch (“echo” auch nicht).
Drittens ist es nicht sinnvoll, für jeden Buchstaben eine separate Abfrage
auszuführen. Führ *eine* Abfrage aus und sortier das Ergebnis nach Nachname
(das kann schon MySQL). Darüber kannst Du in PHP iterieren und den
Anfangsbuchstaben nur dann generieren, wenn er sich beim Nachnamen im
Vergleich zum vorhergehenden Eintrag ändert (so mache ich das bisher, jedoch
nicht für Nachnamen [1]).
Viertens könntest Du, wenn Du ein vorsortiertes Array aus Datensätzen hast,
dieses nach Anfangsbuchstaben zusammenfassen:
$ php -r '
$names = [
["name" => "alois"],
["name" => "anton"],
["name" => "barbara"],
["name" => "berta"]
];
$names_by_letter = [];
array_walk($names,
function ($e) use (&$names_by_letter) {
$letter = $e["name"][0];
$names_by_letter[$letter][] = $e;
});
print_r($names_by_letter);'
Array
(
[a] => Array
(
[0] => Array
(
[name] => alois
)
[1] => Array
(
[name] => anton
)
)
[b] => Array
(
[0] => Array
(
[name] => barbara
)
[1] => Array
(
[name] => berta
)
)
)
Siehe <
http://php.net/array_walk> (Du kannst stattdessen auch eine for- oder
foreach-Schleife verwenden; die array_*-Funktionen sind eleganter, aber
nicht notwendigerweise effizienter). Dann kannst Du über dieses Array (mit
“foreach”) iterieren bzw. es mit “echo implode('…', array_map(…, …));”
geeignet ausgeben.
Der Ansatz, Einträge nach Anfangsbuchstaben zusammenzufassen, verhindert bei
einer Index-Darstellung, die nicht gleichzeitig die Einträge ausgeben soll,
dass die Index-Darstellung Angaben für nicht existierende Einträge enthält.
(Deshalb werde ich den ab sofort für alphanumerische Verzeichnisse
verwenden.) Ebenso kann er die Suche in den Daten beschleunigen (auf diese
Weise lässt sich ein nach Buchstaben indizierter Suchbaum erstellen).
HTH
______
[1] <
http://PointedEars.de/es-matrix#features-table>