Array mit natcasesort sortieren?

  • Themenstarter Themenstarter Katharina_
  • Beginndatum Beginndatum
K

Katharina_

Hallo Zusammen

Ich habe einen Array letze Woche mit natcasesort sortieren lassen. Dachte dies funktioniert auch wunderbar. Jedoch habe ich heute einen Fehler gefunden. Bei folgenden Werten:
Test1
Test2
...
Test600 wird dies durch die Zahl fehlerhaft sortiert. Kann ich dies irgendwie verhindern?

PS noch eine Frage:
Ein array gebe ich nun stück für stück wie folgt aus:
while (list($key, $value) = each ($test)) {
Wie kann ich dies ändern, so dass er mir z.B. nur die ersten 10 ausgibt, oder nur 10 - 30 ausgibt oder so?

Gruss

Katharina
 
Zu 1:
Bei mir wird es sortiert, wie erwartet.
Ansonsten kannst Du [phpf]sort[/phpf] verwenden oder mit [phpf]usort[/phpf] und einer eigenen Vergleichsfunktion sortieren.

Zu 2: Du benötigst eine Hilfsvariable
PHP:
$i=0;
while (list($key, $value) = each ($test)) {
    if ($i>9 && $i<31) {
        //... doIt
    }
    $i++;
}
Wenn Du numerische Indizes hast, kannst Du es auch mir einer normalen for-Schleife machen:
PHP:
for ($i=10; $i<31;$i++) {
    $key=$i;
    $value=$test[$i];
    //...doIt
}
 
hpvw hat gesagt.:
Zu 1:
Bei mir wird es sortiert, wie erwartet.
Ansonsten kannst Du [phpf]sort[/phpf] verwenden oder mit [phpf]usort[/phpf] und einer eigenen Vergleichsfunktion sortieren.

Zu 2: Du benötigst eine Hilfsvariable
PHP:
$i=0;
while (list($key, $value) = each ($test)) {
    if ($i>9 && $i<31) {
        //... doIt
    }
    $i++;
}
Wenn Du numerische Indizes hast, kannst Du es auch mir einer normalen for-Schleife machen:
PHP:
for ($i=10; $i<31;$i++) {
    $key=$i;
    $value=$test[$i];
    //...doIt
}

Hallo

Bei mir Sortiert er es auch richtig. Nur eben das mit test1, test2, test3...test 600 macht er es falsch. Und genau hier liegt mein Problem. Ich verstehe dies nicht warum es so ist.
Wie könnte ich es denn machen das er es nach dem alphabet macht auch die nummern anschaur (testXXX)m und nicht auf Gross-Kleinschreibung achtet?

Gruss

Katharina
 
Ich verstehe Dein Problem nicht ganz, vielleicht kannst Du mal ein ausführlicheres Beispiel posten (Soll-Ist-Vergleich). Evtl. hilft Dir [phpf]natsort[/phpf].

Gruß hpvw
 
Ok.

Also:
Soll:
test1
test2
test3
test4
....
test600
test601
...
test601

IST:
test667
test666
test668
test669
test671
etc
Ich weiss nicht wie er dazu kommt eine derartige sortierung durchzuführen. Teils macht er auch einen Sprung von 300 also test 835 und dann 501.

Bei MA und Mü oder Wb und Wi funktionierts ohne Probleme.

PS: Falls dies von bedeutung ist:
Der array ist so aufgebaut:
test1|wert1|noch was|irgend was
test2|wert2|mehr| und noch mehr
Habe den Array getrennt also jede zeile ist ein array.
Im Code:
foreach($array as $value) $test[] = explode('|', $value);
natcasesort($test);
reset($test);
while...
und hier kommt eben das falsche raus aber nur da. bei Ma Me etc geht es problemlos.

Gruss

Katharina
 
Zuletzt bearbeitet von einem Moderator:
Ich habe mal Deine IST-Werte in ein array geschrieben und sortieren lassen.
Das Ergebnis ist, wie erwartet:
PHP:
<?
$arr=array(
    "test667",
    "test666",
    "test668",
    "test669",
    "test671");

natcasesort($arr);
print_r($arr);

/* Ausgabe:
Array
(
    [1] => test666
    [0] => test667
    [2] => test668
    [3] => test669
    [4] => test671
)
*/
>?
Wie Du siehst hat sich an den Indexassoziationen nichts geändert. Wenn Du in diesem Fall also nicht, wie oben angesprochen, mit each oder foreach auf das Array zugreifst, sondern direkt über Indizes 0 bis n, wird sich an der Sortierung nichts geändert haben.

Soweit allgemein.

Wenn ich das richtig sehe, landet in Deinem Array $test ein weiteres Array.
In diesem Fall müßtest Du mit [phpf]usort[/phpf] arbeiten und mit [phpf]strnatcasecmp[/phpf] das erste Element (0) des inneren Arrays in einer benutzerdefinierten Vergleichsfunktion vergleichen:
PHP:
function cmp($a,$b) {
    return strnatcasecmp($a[0],$b[0]);
}
$test=array();
foreach($array as $value) {
    $test[] = explode('|||||', $value);
    //wäre hier nicht explode('|', $value); richtig?
}
usort($test,"cmp");
reset($test);
Gruß hpvw

PS: Bitte nutze die Code Tags, [ php ]code[ /php ] für PHP-Quelltexte, [ html ]code[ /html ] für HTML-Quelltexte und [ code ]code[ /code ] für sonstige Quelltexte, natürlich ohne die Leerzeichen. Das macht die Quelltexte übersichtlicher. Für kuze Code-Teile im Fließtext (z.B. Variablen- oder Funktionsnamen) kannst Du [ mono ]kurzer Code fetzen[ /mono ] verwenden.
 
Hallo

Ok danke werde dran denken.
Ja dies war ein schreibfehler. Habe es noch editiert. Keine Ahnung wie ich auf ||||| kam. Denke das war noch aus einem anderen Beispiel. So wie du es geschrieben hast geht es. Nur ein ding ist nun falsch und eine Frage wäre für mich noch offen.
Frage: Wird so Gross-Kleinschreibung auch nicht beachtet?
Fehler: Nun wird Müller und Maier verkehrt anezeigt. Also zuerst Müller dann Maier statt umgekehrt.
EDIT: Fehler2: Bei test1-10 und ih test3 mit test 3 ersetze, wird es trotzdem an dritter stelle angezeigt. Dies dürfte ja aber so nicht sein bei einer normalen Sortierung oderr?

Gruss

Katharina
 
Zuletzt bearbeitet von einem Moderator:
Das liegt daran, dass PHP vermutlich nicht mit deutschem Zeichensatz klarkommt.
Evtl. gibt es dazu Einstellungen in der php.ini, frag' mich aber nicht ob und wo.
Du könntest Dir behelfen, indem Du die gängigen Sonderzeichen ersetzt:
PHP:
function cmp($a,$b) {
    $tempA=str_replace("ä","a",$a[0]);
    $tempB=str_replace("ä","a",$b[0]);

    $tempA=str_replace("ö","o",$tempA);
    $tempB=str_replace("ö","o",$tempB);

    $tempA=str_replace("ü","u",$tempA);
    $tempB=str_replace("ü","u",$tempB);

    $tempA=str_replace("Ä","a",$tempA);
    $tempB=str_replace("Ä","a",$tempB);

    $tempA=str_replace("Ö","o",$tempA);
    $tempB=str_replace("Ö","o",$tempB);

    $tempA=str_replace("Ü","U",$tempA);
    $tempB=str_replace("Ü","U",$tempB);

    //... Und was Dir sonst noch auffällt
    //die Performance leidet allerdings ein bisschen

    return strnatcasecmp($tempA,$tempB);
}

EDIT: zu Fehler 2
Jein. Die "natürliche Ordnung" ist schließlich nicht so objektiv zu definieren, wie die Ordnung auf Basis eines Zeichensatzes. Ich finde es nicht ganz abwegig, dass das Leerzeichen für die Sortierung ignoriert wird.
 
Zuletzt bearbeitet:
Hallo

Bei der MySQL funktion ORDER BY feld ASC geht dies ja auch. Müsste es nicht eine Funktion auch für PHP geben das er mir ganz normal nach dem Alphabet sortiert wie wir dies kennen?

Gruss

Katharina
 
Katharina_ hat gesagt.:
Hallo

Bei der MySQL funktion ORDER BY feld ASC geht dies ja auch. Müsste es nicht eine Funktion auch für PHP geben das er mir ganz normal nach dem Alphabet sortiert wie wir dies kennen?

Gruss

Katharina
Wie gesagt, ich kenne dafür keine spezielle Funktion. Du könntest es mal i.V.m. [phpf]setlocale[/phpf] versuchen, allerdings hatte ich auf meinem Windows-System damit keinen Erfolg.
 
Zurück