Array unabhängig von Groß-/Kleinschreibung nach Alphabet sortieren

M3Y3R

Well-known member
ID: 336361
L
8 Mai 2006
1.608
60
Hallo,

trotz php.net schaffe ich es nicht, dass mein Array unabhängig von groß-/kleinschreibung nach Alphabet sortiert wird.

Bei "natcasesort" wird alles durcheinander gewürfelt, was ja net soll.
Wer kann mir helfen?
 
PHP:
<?php
$tiere = array("biene", "Zebra", "elefant", "Affe");
sort(strtolower($tiere));
foreach($tiere as $blubb => $tier){
    echo $tier."<br />";
}
?>
 
Kann's sein, dass Du nicht mittels foreach() sondern anhand einer for()-Schleife über das Array iterierst?

Eigentlich funktioniert natcasesort() genauso, wie's sollte...
PHP:
<?php
	$a = array('zebra', 'Bunker', 'tandem', 'Makake', 'dilema');
	natcasesort($a);
	echo '<pre>',print_r($a, true),'</pre>';
?>
Code:
Array
(
    [1] => Bunker
    [4] => dilema
    [3] => Makake
    [2] => tandem
    [0] => zebra
)
Anhand der Indizes kann man ja sehen, dass for() schiefgehen wird und die alte Sortierung erhalten bleibt. Abhilfe wäre da wie schon erwähnt das Iterieren mittels foreach() oder (falls sichergestellt ist, dass kein Wert im Array doppelt vorkommt) array_values()...
 
Hi

ich greife mal tleilax auf.

wenn du das array sortiert haben willst so das der index [0] => Bunker ist solltest du das vielleicht so machen:

PHP:
$a = array('zebra', 'Bunker', 'tandem', 'Makake', 'dilema');
$b = array();
natcasesort($a);
foreach ($a as $val) {
  $b[] = $val;
}
$a = $b
// ausgeben des Arrays
echo '<pre>',print_r($a, true),'</pre>';

Das ergibt dann:
PHP:
Array
(
    [0] => Bunker
    [1] => dilema
    [2] => Makake
    [3] => tandem
    [4] => zebra
)

Igel

EDIT:
hab dir das mal zu ner funktion umgeschrieben wer weiß wie oft du das brauchst ;)

PHP:
/**
 * Arrays alphabetisch sortieren (case-insensitive)
 *
 * @param array $arrInput
 * @return array
 */
function sortMyArray($arrInput) {
  if(false === is_array($arrInput)) {
    return false;
  }
  if(false === natcasesort($arrInput)) {
    return false;
  }
  $result = array();
  foreach ($arrInput as $val) {
    $result[] = $val;
  }
  return $result;
}
 
Zuletzt bearbeitet:
Schon ein bisschen komisch, dass natcasesort die Schlüssel beibehält, obwohl das im Manual nicht explizit dasteht und es bei den anderen Sortierfunktionen auch nicht so ist, da gibt's dann immer noch eine mit einem zusätzlichen r im Namen drin.

Aber für diese foreach-Schleife müsste es ggf. noch einen besseren Ersatz (eine Funktion) geben?!


dslicer at maine dot rr dot com schrieb:
03-Jun-2003 03:41

Something that should probably be documented is the fact that both natsort and natcasesort maintain the key-value associations of the array. If you natsort a numerically indexed array, a for loop will not produce the sorted order; a foreach loop, however, will produce the sorted order, but the indices won't be in numeric order. If you want natsort and natcasesort to break the key-value associations, just use array_values on the sorted array, like so:

natcasesort($arr);
$arr = array_values($arr);
 
Naja, es steht zwar nicht unter natcasesort(), aber unter natsort() (wovon natcasesort() ja nur eine Sonderform ist) steht explizit:
This function implements a sort algorithm that orders alphanumeric strings in the way a human being would while maintaining key/value associations.
Und die Variante mit array_values() hatte ich ja auch oben schon angemerkt. Klappt halt nur, wenn kein Wert innerhalb des Arrays doppelt vorkommt...
 
Ah ja.. tut mir leid. Das hab' ich zwar gestern gelesen und wahrgenommen, dachte aber die Funktion hätte eine.. andere Funktion. :ugly: (Keys extrahieren... -- doof, vor allem wenn's der Namen schon sagt, dass es wenn dann Werte sind)
:oops: Dem war dann wohl nicht so, wie man ja sieht. Ich erinnerte mich dann dooferweise nicht mehr an oben. Es sei mir verziehen!
 
Moin

nachdem ich meine php Doku gewälzt habe hab ich was das du testen kannst

PHP:
$array= array("img12.png", "Img3.png", "img4.png", "img1.png");

usort($array, "strnatcasecmp");

print_r($array);

Das macht dein array genauso wie meine Funktion ein paar Posts weiter oben.

PHP:
Array
(
    [0] => img1.png
    [1] => Img3.png
    [2] => img4.png
    [3] => img12.png
)