Sortieren und unterteilen
September 2009
Diese Funktion bietet die Möglichkeit, einen Array caseinsensitive und natürlich zu sortieren, wobei Umlaute ihrem Grundbuchstaben zugerechnet werden, wie auch ganze Zeichenfolgen speziell behandelt werden können.
Bei der Ausgabe des Arrays werden die Elemente nach ihrem Anfangsbuchstaben in insgesamt 27 Gruppen unterteilt, nämlich A-Z und # (anderes Zeichen), ähnlich wie in einer Kategorie von Wikipedia.
Mögliche Ausgabe des Skripts:
In der "Übersetzungstabelle" $chars können auch andere Zeichen und Zeichenfolgen aufgenommen werden, wie beispielsweise '€'=>'E' oder 'St.'=>'Sankt' (Gross-/Kleinschreibung wird berücksichtigt).
Mittels $stopwords können Zeichenfolgen ignoriert werden, z.B. 'das ' (mit Leerzeichen am Ende), wodurch "das Haus" unter "Haus" einsortiert wird (Gross-/Kleinschreibung wird nicht berücksichtigt).
Siehe auch:
Bei der Ausgabe des Arrays werden die Elemente nach ihrem Anfangsbuchstaben in insgesamt 27 Gruppen unterteilt, nämlich A-Z und # (anderes Zeichen), ähnlich wie in einer Kategorie von Wikipedia.
<?php
# Die zu sortierenden Begriffe
$words = array('immerdagewesenes', 'Überschüssiges', 'Anderes',
'die Uhr', '104', 'abends', '63', 'Identisches', 'ähnliches');
# Umlaute/Sonderzeichen
$chars = array('Ä'=>'A', 'Ö'=>'O', 'Ü'=>'U',
'ä'=>'a', 'ö'=>'o', 'ü'=>'u', 'ß'=>'ss');
# Stopwörter
$stopwords = array('der ', 'die ', 'das ');
usort($words, 'strnatcasecmpspec'); # Sortieren
$prevL = ''; // Vorheriger Anfangsbuchstabe (uppercase)
foreach($words as $str){
if($prevL !== initialLetter($str)) // wenn neues Anfangszeichen
echo '<b>'.initialLetter($str).'</b><br />';
echo $str.'<br />'; // Wort ausgeben
$prevL = initialLetter($str);
}
# strnatcasecmp() mit Übersetzung
function strnatcasecmpspec($a, $b){
// Stopwörter streichen
$a = str_ireplace($GLOBALS['stopwords'], '', $a);
$b = str_ireplace($GLOBALS['stopwords'], '', $b);
// Sonderzeichen ersetzen
$a = strtr($a, $GLOBALS['chars']);
$b = strtr($b, $GLOBALS['chars']);
return strnatcasecmp($a, $b);
}
# Anfangsbuchstabe holen
function initialLetter($tmpStr){
// Stopwörter streichen
$tmpStr = str_ireplace($GLOBALS['stopwords'], '', $tmpStr);
// Sonderzeichen ersetzen
$tmpStr = strtr($tmpStr, $GLOBALS['chars']);
// erstes Zeichen holen
$first = substr($tmpStr, 0, 1);
$first = strtoupper($first);
// A bis Z oder Sonstige (#)
return preg_match('/[A-Z]/', $first) ? $first : '#';
}
?>
Mögliche Ausgabe des Skripts:
#
63
104
A
abends
ähnliches
Anderes
I
Identisches
immerdagewesenes
U
Überschüssiges
die Uhr
63
104
A
abends
ähnliches
Anderes
I
Identisches
immerdagewesenes
U
Überschüssiges
die Uhr
In der "Übersetzungstabelle" $chars können auch andere Zeichen und Zeichenfolgen aufgenommen werden, wie beispielsweise '€'=>'E' oder 'St.'=>'Sankt' (Gross-/Kleinschreibung wird berücksichtigt).
Mittels $stopwords können Zeichenfolgen ignoriert werden, z.B. 'das ' (mit Leerzeichen am Ende), wodurch "das Haus" unter "Haus" einsortiert wird (Gross-/Kleinschreibung wird nicht berücksichtigt).
Siehe auch:
