Auge: mysql, sortierung ABC

Beitrag lesen

Hallo

SELECT DISTINCT den ersten Buchstaben der Städte

jetzt habe ich zwei Abfragen, die jede für sich funktionieren,

Hier ist ja erstmal eine Abfrage, nämlich die, die unten steht, relevant.

$result = mysql_query("select distinct substr(titel,1,1) AS anfangsbuchstabe from cassis_plugin_glossar order by titel asc ") ;

while($row = mysql_fetch_array($result)) 
	{
	echo  $row['anfangsbuchstabe'].'<br/>';
	}

so erhalte ich alle belegten Anfangsbuchstaben

und hiermit gebe ich das ABC aus: …

Ich würde etwas anders als du an die Aufgabe gehen. Du hast erst einmal eine Liste der tatsächlich benutzten Anfangsbuchstaben. Was dir fehlt, ist der Vergleich mit allen möglichen Anfangsbuchstaben. Ich gehe für das Beispiel davon aus, dass es nur lateinische Buchstaben als Anfangsbuchstaben gibt.

# Überführung des Abfrageergebnisses in ein Array
$initialLetter = array();
# mysql_fetch_assoc statt mysql_fetch_array
while ($row = mysql_fetch_assoc($result)) {
  $initialLetter[] = strtoupper($row['anfangsbuchstabe']);
}

Überführe das Ergebnis in ein Array namens initialLetter. Buchstaben werden als Großbuchstaben angegeben.

# Array mit allen Buchstaben des Alphabets
$alphabet = range("A", "Z");
$listAlphabet = array();

Zwei Arrays, eines mit allen Buchstaben des Alphabets, ein zweites, welches das Ergebnis der Operation aufnimmt und zur Generierung der Ausgabe dient.

# Vergleich des Alphabets mit der Rückgabe aus der DB
foreach ($alphabet as $letter) {
  if (in_array($letter, $initialLetter) === true) {
    # Anfangsbuchstabe vorhanden
    $listAlphabet[$letter] = true;
  } else {
    # Anfangsbuchstabe nicht vorhanden
    $listAlphabet[$letter] = false;
  }
}

In einer Schleife werden alle Buchstaben des Alphabets aufgerufen und es wird geprüft, ob in der Datenbank Einträge mit dem Buchstaben existieren. Existieren welche, ergibt die Prüfung mit in_array true, sonst false. Das Ergebnis-Array nimmt den Buchstaben als Schlüssel des Eintrags und das (Nicht-)Vorhandensein von Einträgen als booleschen Wert (true, false) auf.

# Erzeugung der Ausgabe
$output = '<ul>';
foreach ($listAlphabet as $key => $val) {
  $output .= '<li>';
  if ($val === true) {
    $output .= '<a href="?letter='. $key .'">'. $key .'</a>';
  } else {
    $output .= $key;
  }
  $output .= '</li>';
}
$output .= '</ul>';

Erzeuge eine Liste aller Buchstaben und verlinke den Eintrag, wenn der Wert des Elements true ist (es Einträge zu diesem Buchstaben in der DB gibt).

Bei Fragen fragen.

Tschö, Auge

--
Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
Terry Pratchett, „Gevatter Tod“