PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : natcasesort zerstört Array


silberlocke
21.02.2005, 22:26:29
Hi!

Habe gerade ein Problem, und zwar macht mir natcasesort mein Array kaputt.

$temp=natcasesort($temp1);

Aus
$temp1: Array ( [0] => 5C-Schüler_3 [1] => 5C-Schüler_2 )

wird
$temp: 1

Weiß da jemand bescheid?

Gruß, Silberlocke

xabbuh
21.02.2005, 22:28:31
natcasesort() hat keinen Rückgabewert:

<?php
$temp = $temp1;
natcasesort($temp);
?>

silberlocke
22.02.2005, 01:48:06
Dankeschön! Das ist es wohl gewesen.

silberlocke
22.02.2005, 02:45:08
Leider doch nicht.
Wenn ich das sortierte Array, (das sind jetzt nur Probewerte, also nicht wundern)

Array ( [4] => 2#2;ghkkljkll;zojl;; [1] => 3#3;srzth;fgh;fg; [3] => 4#4;ghkkljkll;zojl;; [2] => 5#5;gkkl;zo;fg; [0] => 7#7;sdfg;dfgfd;dfg; )

(Etwas stutzig macht mich, daß an Position 0 nicht [0], sondern die alte Position [4] steht)

ausgeben will,

$aufst_neu_sort=$aufst_neu_temp;
natcasesort($aufst_neu_sort);

$x=0;
while ($x<count($aufst_neu_sort))
{
echo ($aufst_neu_sort[$x],"#"),"<br>";
$x++;
}


sehe ich wieder die alte Reihenfolge

7#7;sdfg;dfgfd;dfg;
3#3;srzth;fgh;fg;
5#5;gkkl;zo;fg;
4#4;ghkkljkll;zojl;;
2#2;ghkkljkll;zojl;;

c4
22.02.2005, 08:21:14
Damit hast Du Dich aber schön selber verarscht! :)

natcasesort() sortiert nach den Werten der Felder im Array und behält die Indizes bei. Du siehst es ja, die 7#... steht ganz hinten und hat weiterhin den Index 0.

Liest Du nun das Array mit einer Zählschleife aus, dann richtet er sich nicht nach der Sortierung, sondern an dem aktuellen Wert dieser Schleife. Also von 0 bis 4, darum sieht's aus wie immer.

Du kannst die Schleife auch so auslesen: foreach ($aufst_neu_sort as $key => $value) {
echo "$key: $value<br>n";
} Man glaube ich auch den Index neu aufbauen lassen, ist aber fraglich ob Du das willst.

silberlocke
22.02.2005, 11:37:10
Einen neuen Index brauch ich wohl nicht. Ich muß das Array, so wie es ist, wieder in eine Datei schreiben. Geht das so mit dem foreach-Bereich?


$fp=fopen($pfad_aufst_txt,w);
if ($fp)
{
flock($fp,2);
$nl = chr(13) . chr(10);

foreach ($aufst_neu_sort as $key => $value)
{
fputs($fp, trim($value)); // oder ist trim() hier überflüssig?
}

if ($x+1 != count($aufst_neu)) //nach letzter Zeile keinen Zeilenumbruch
{
fputs($fp,$nl);
}

flock($fp,3);
fclose($fp);
}


Ist das bei sort() eigentlich auch so, oder wird da der Index gleich neu aufgebaut? Ich meine daß ich damit nicht solche Probleme hatte, aber jetzt brauch ich die menschlich Sortierreihenfolge.

|Coding
22.02.2005, 11:46:11
wenn du sicher sein kannst dass keine überflüssigen leerzeichen am anfang und ende des strings sind, kannst du es ohne trim() machen.

c4
22.02.2005, 11:53:35
Wenn die Datei nicht Tausende von Zeilen lang ist, dann kannst Du es auch einfach so machen: $txt=join("rn", $aufst_neu_sort);
$txt=trim($txt);
$fh=fopen('datei.txt', 'w');
fwrite($fh, $txt);
fclose($fh);

Um Deine Frage zu beantworten: Ja, so ginge es mit dem foreach()dingens.

silberlocke
22.02.2005, 12:19:15
Es klappt!
Ich hab das jetzt mal so gemacht. Die Zeile mit dem Zeilenumbruch war noch ein Überbleibsel aus dem vorherigen Versuch mit der while-Schleife.




...
...
...
$nl = chr(13) . chr(10);
$x=0;

foreach ($aufst_neu as $key => $value)
{
fputs($fp, trim($value));
$x++;
if ($x != count($aufst_neu))
{
fputs($fp, $nl);
}
}

flock($fp,3);
fclose($fp);
...



Aber wie das jetzt mir sort() aussieht, würd mich ja auch interessieren. Alter oder neuer Index?.

@c4: Da wird aber nach letzter Zeile umgebrochen, oder?

c4
22.02.2005, 12:32:40
@c4: Da wird aber nach letzter Zeile umgebrochen, oder? Nein, dafür ist ja das trim() da. Das entfernt schließlich alles Whitespaces (Leerzeichen, Tabulator und Zeilenumbrüche) am Anfang und Ende des Strings.
Umgebrochen wird nur zwischen den Zeilen.