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.

<?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($tmpStr01);
  
$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

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:
 
PHP


Andere Einträge