Array aufsplitten nach Anfangsbuchstaben

blackhawkblade

Grünschnabel
Ich will eine Übersichtsseite für ne Site generieren
wie hier z.b.
http://www.stadthotel.de/

dafür will ich en template machen in dem für jeden Buchstaben im Alphabet ein Platzhalter mit [a], [b] etc da steht
die stadtnamen krieg ich von ner mysql datenbank und die werden in ein Array geschrieben das funktioniert soweit.
Nur würde ich die Städte aus dem Array dann gern nach Anfangsbuchstaben in ein 2. array bringen, so das ich mit ner for schleife oder so den Array mit allen Städten die mit A anfangen abarbeite und dann per str replace mit [a] ersetze, dann soll der Array mit allen Städten die mit B anfangen gefüllt werden und dasselbe wieder usw. Falls es keine Städte mit einem bestimmten Buchstaben gibt bleibt das leer.
mein Problem is das Array befüllen
ne möglichkeit ist
PHP:
function stadt ($wert) {
    return (substr("$wert", 0,1)=="A");
}

$keyword = array();

$keyword[] = $row_keywords['stadt'];

$citylist = array_filter($keyword, "stadt");
citylist wird dann benutzt um [a] zu ersetzen und soll im nächsten Schleifendurchlauf (gefüllt mit allen Städten mit B als Anfangsbuchstabe) dasselbe tun

das Problem is der filtert nur für a ich müsste,wenn ich das richtig sehe, mit dieser Methode ne function für jeden Buchstaben schreiben, das is ja doof...
möglich wäre es mit geschachtelten Schleifen selber ne Filterfunktion zu schreiben.. nur wär die vllt aufwendig also auch rechenaufwendig für den server..
gibts da ne elegantere Lösung oder hab ich eh den falschen Ansatz?
 
Spontan fällt mir folgendes Beispiel ein:
PHP:
function array_splitByFirstChar( $array )
{
	$retVal = array();
	$char = strtoupper($array[0]{0});
	$count = count($array);
	for($i=0; $i<$count; $i++) {
	    if( strtoupper($array[$i]{0}) !== $char ) {
	        $char = strtoupper($array[0]{0});
	        $retVal[$char] = array_splice($array, 0, $i);
	        $count = count($array);
	        $i = -1;
	    }
	}
	if( !empty($array) ) {
	    $retVal[$char] = $array;
	}
	return $retVal;
}
Das Array der Eingabewerte muss dafür schon vorsortiert sein und darf nur numerische Schlüssel haben.
 
Ich hab da grad mal eine kleine Funktion geschrieben die Dir dabei helfen duerfte.
PHP:
function sortthis($inarray)
{
  $outarray=array();
  for ($x=0;$x<26;$x++)
    {
      $outarray[chr($x+65)]=array();
    }
  for ($x=0;$x<count($inarray);$x++)
    {
      $outarray[strtoupper(substr($inarray[$x]0,1))][]=$inarray[$x];
    }
  return $outarray;
}
Wenn Du die einzelnen Werte innerhalb der Sub-Arrays auch noch sortiert haben willst sieht die Funktion so aus:'
PHP:
function sortthis($inarray)
{
  $outarray=array();
  for ($x=0;$x<26;$x++)
    {
      $outarray[chr($x+65)]=array();
    }
  for ($x=0;$x<count($inarray);$x++)
    {
      $outarray[strtoupper(substr($inarray[$x],0,1))][]=$inarray[$x];
    }
  for ($x=0;$x<26;$x++)
    {
      sort($outarray[chr($x+65)]);
    }
  return $outarray;
}
 
danke gumbo schonma das guck ich mir nachher ma an

@ dennis wronka vielen vielen Dank schonma für deine Mühe ich hab nur leider noch ein kleines Problem mit dem verständnis bin leider noch kein php pro
hab en problem mit der Zeile hier
PHP:
 $outarray[chr($x+65)]=array();
wofür die 65
wenn du das ganze en bischen näher erläutern könntest wär ich dir dankbar ansonsten bin ich immernoch für ander vorschläge offen je mehr desto besser :)
 
Die Großbuchstaben des lateinischen Alphabets (also auch die unseres Alphabets) beginnen im ASCII-Zeichensatz ab der Position 65. Deshalb die Korrektur von plus 65.

Ich merke gerade, dass die array_splice()-Funktion bei großen Arrays schnell in die Knie geht.
 
Zurück