Hallo,
bin gerade dabei PHP zu lernen und habe aus einem Buch "Programmieren lernen in PHP5" folgendes Script zum erstellen eines Verzeichnisses:
-----
define("DELIMITER", " ");
function fillin($w, $n)
{
for($i=1; $i<=$n; $i++)
{
echo DELIMITER .chr((ord($w)) +$i);
}
}
$wordlist=array("Depp", "Xara", "Benno", "Aarset", "Ludwig", "Thodor", "Max");
sort($wordlist);
$oldword="A";
foreach($wordlist as $word)
{
$word=strtoupper(substr($word, 0, 1));
$next=strncasecmp($word, $oldword, 1);
if($next>0) fillin($oldword, --$next);
echo DELIMITER ."<b><u><a href='#$word'>$word</a></u></b>";
$oldword=$word;
}
fillin($oldword, strncasecmp("Z", $word,1));
----
Ist ja soweit auch recht schön, aber wenn nun im Array zwei Wörter mit dem gleichen Buchstaben beginnen, wird mir im Verzeichnis der Buchstabe zweimal angezeigt. Das habe ich versucht wie folgt zu unterdrücken:
-----
foreach($wordlist as $word)
{
$word=strtoupper(substr($word, 0, 1));
$next=strncasecmp($word, $oldword, 1);
if(!isset($verz)||$word!=$verz)
{
if($next>0) fillin($oldword, --$next);
echo DELIMITER ."<b><u><a href='#$word'>$word</a></u></b>";
$oldword=$word;
$verz=$word;
}
}
fillin($oldword, strncasecmp("Z", $word,1));
-----
Funktioniert soweit auch (gibt es da eine elegantere Lösung?)
Aber mir sind noch zwei Sachen aufgefallen und da finde ich noch keinen Lösungsansatz:
-
Wenn im Array kein Element mit A vorkommt, wird das A nicht ausgegeben! - Sollte es aber, ohne Link. (wenn kein A und kein B fängt das Verzeichnis mit B an, Wenn kein A ebenso)
-
Wenn ich im Array ein Element habe, das mit einem kleinen Buchstaben beginnt (also zum Beispiel "bernd") wird das ABC-Verzeichnis doppelt ausgegeben und das klein geschriebene Element wird in der zweiten ABC Reihenfolge verlinkt(ist das verständlich ausgedrückt?) Wie muß ich das schreiben, dass auch der kleine Buchstabe als gleichwertig erkannt wird?
Und noch ein Problem: ich möchte das Verzeichnis gerne im Format A - B - C - etc. haben.
wenn ich nun
define("DELIMITER", " - ");
definiere habe ich natürlich - A - B - C - etc.
Wie kann ich das unterdrücken, daß der Delimiter schon vor dem ersten Element geschrieben wird.
Last but not least soll das Verzeichnis natürlich noch auf etwas verweisen, das habe ich wie folgt geschrieben:
----
foreach($wordlist as $word)
{
$verzeichnis=strtoupper(substr($word, 0, 1));
if(!isset($buchstabe)||$buchstabe!=$verzeichnis)
{
echo "<b><a name='$verzeichnis'>$verzeichnis</a></b><br>";
$buchstabe=$verzeichnis;
}
echo "$word<br>";
}
----
Funktioniert auch, aber wollte wissen, ob es da nicht eine bessere Lösung gibt, besonders da ich ja im Prinzip die gleiche Syntax/Abfrage oder wie man das nennt, ja schon weiter oben habe um das Verzeichnis zu erstellen.
Wäre euch dankbar, wenn ihr mir weiterhelfen könntet, auch wenn dieses Posting länger ist als geplant....
Danke,
Frank