Sortierprobleme
Fat Freddys Dog
- php
Ich habe folgendes Problem:
Ich will einen Text auslesen, und die Worte zählen. Danach sollen die Worte sortiert werden, und zwar nach ihrer Anzahl werden.Mit dem auslesen funktioniert so weit alles. Aber das sortieren funktioniert nicht. Anbei der Quelltext mit den entsprechenden Kommentaren:
<?
$datei = 'helge.txt';
$content = file_get_contents($datei);
?>
<pre>
<!--Sortierung läuft alphabetisch?-->
<?
$anzahlWorte = preg_split('/[ ]+/',$content);
sort($anzahlWorte);
print_r(array_count_values($anzahlWorte));
?>
<!--Versuch einer Schleife die erst auszählt, und dann sortiert aber leider nur den Wert 1 zurückwirft-->
<?
$doppelteWorte = preg_split('/[ ]+/',$content);
$gezaehlteWorte = array_count_values($doppelteWorte);
print_r(sort($gezaehlteWorte));
?>
</pre>
<br>
Hi,
Aber das sortieren funktioniert nicht.
Und was heißt das?
$anzahlWorte = preg_split('/[ ]+/',$content);
Befinden sich alle Wörter in einer Zeile, ohne Interpunktion? Ansonsten wäre es sinnvoll, Interpunktionszeichen und Zeilenumbrüche noch mit in den Trenner aufzunehmen.
<!--Versuch einer Schleife die erst auszählt, und dann sortiert aber leider nur den Wert 1 zurückwirft-->
<?
$doppelteWorte = preg_split('/[ ]+/',$content);
$gezaehlteWorte = array_count_values($doppelteWorte);
print_r(sort($gezaehlteWorte));
1. Wo ist da eine Schleife?
Daß bei print_r 1 rauskommt, dürfte am Rückgabewert der Funktion sort (TRUE bei Erfolg, FALSE sonst) liegen.
cu,
Andreas
Hi,
Aber das sortieren funktioniert nicht.
Und was heißt das?
$anzahlWorte = preg_split('/[ ]+/',$content);
Befinden sich alle Wörter in einer Zeile, ohne Interpunktion? Ansonsten wäre es sinnvoll, Interpunktionszeichen und Zeilenumbrüche noch mit in den Trenner aufzunehmen.
Das ist nebensächlich, der Text hat viele Fehler, und es ist nur eine kleine Übung, es geht hier nicht um korrekte Rechtschreibung
<!--Versuch einer Schleife die erst auszählt, und dann sortiert aber leider nur den Wert 1 zurückwirft-->
<?
$doppelteWorte = preg_split('/[ ]+/',$content);
<!-- Nach Wörtern splitten-->
$gezaehlteWorte = array_count_values($doppelteWorte);
<!--Wörter und ihre Häufigkeit auszählen-->
print_r(sort($gezaehlteWorte));
<!--sortieren nach der Anzahl->>
- Wo ist da eine Schleife?
Muss mich verbessern, ein Variable, habe ansonsten noch mal kommentare hinzugefügt
Daß bei print_r 1 rauskommt, dürfte am Rückgabewert der Funktion sort (TRUE bei Erfolg, FALSE sonst) liegen.
cu,
Andreas
mfg Fat Freddys Dog
Moin!
Ich will einen Text auslesen, und die Worte zählen. Danach sollen die Worte sortiert werden, und zwar nach ihrer Anzahl werden.Mit dem auslesen funktioniert so weit alles. Aber das sortieren funktioniert nicht.
Logisch. Denn das ist genau das, was du programmiert hast. Ich habe in deinen Code mal Kommentare integriert.
> <pre>
> <!--Sortierung läuft alphabetisch?-->
> <?
> $anzahlWorte = preg_split('/[ ]+/',$content);
// Entgegen deiner Variablenbezeichnung hast du hier kein Array mit der Anzahl von Worten, sondern ein Array mit allen Worten.
> sort($anzahlWorte);
// Hier sortierst du deine Worte alphabetisch - was sinnlos ist, wenn du sie hinterher noch zählen willst.
> print_r(array_count_values($anzahlWorte));
// Hier verwirrst du dich selbst, indem du die richtige Funktion benutzt, aber deren Ergebnis nicht speicherst und später weiterverwendest.
> ?>
>
> <!--Versuch einer Schleife die erst auszählt, und dann sortiert aber leider nur den Wert 1 zurückwirft-->
> <?
> $doppelteWorte = preg_split('/[ ]+/',$content);
// Dasselbe wie oben: Nicht nur doppelte Worte werden hier ermittelt.
> $gezaehlteWorte = array_count_values($doppelteWorte);
// Das ist korrekt, damit erhälst du alle Worte als Arrayschlüssel, und deren Anzahl als Arraywert ermittelt.
> print_r(sort($gezaehlteWorte));
// Die Funktion sort() weist den Arraywerten neue Arrayschlüssel zu (numerisch aufsteigend) - damit verlierst du die Info, was das für ein Wort war, welches am häufigsten, zweithäufigsten... enthalten war.
// Verwende asort() - damit bleiben die Arrayschlüssel erhalten, und werden nur in die richtige Reihenfolge gebracht. Ausgabe dann mit foreach.
> ?>
>
> </pre>
> <br>
- Sven Rautenberg
Moin!
Ich will einen Text auslesen, und die Worte zählen. Danach sollen die Worte sortiert werden, und zwar nach ihrer Anzahl werden.Mit dem auslesen funktioniert so weit alles. Aber das sortieren funktioniert nicht.
Logisch. Denn das ist genau das, was du programmiert hast. Ich habe in deinen Code mal Kommentare integriert.
<pre>
<!--Sortierung läuft alphabetisch?-->
<?
$anzahlWorte = preg_split('/[ ]+/',$content);
// Entgegen deiner Variablenbezeichnung hast du hier kein Array mit der Anzahl von Worten, sondern ein Array mit allen Worten.
sort($anzahlWorte);
// Hier sortierst du deine Worte alphabetisch - was sinnlos ist, wenn du sie hinterher noch zählen willst.
print_r(array_count_values($anzahlWorte));
// Hier verwirrst du dich selbst, indem du die richtige Funktion benutzt, aber deren Ergebnis nicht speicherst und später weiterverwendest.
?><!--Versuch einer Schleife die erst auszählt, und dann sortiert aber leider nur den Wert 1 zurückwirft-->
<?
$doppelteWorte = preg_split('/[ ]+/',$content);
// Dasselbe wie oben: Nicht nur doppelte Worte werden hier ermittelt.
$gezaehlteWorte = array_count_values($doppelteWorte);
// Das ist korrekt, damit erhälst du alle Worte als Arrayschlüssel, und deren Anzahl als Arraywert ermittelt.
print_r(sort($gezaehlteWorte));
// Die Funktion sort() weist den Arraywerten neue Arrayschlüssel zu (numerisch aufsteigend) - damit verlierst du die Info, was das für ein Wort war, welches am häufigsten, zweithäufigsten... enthalten war.
// Verwende asort() - damit bleiben die Arrayschlüssel erhalten, und werden nur in die richtige Reihenfolge gebracht. Ausgabe dann mit foreach.
?></pre>
<br>
Wie ist das mit foreach gemeint? Tschuldigung, bin absoluter Anfänger....
Na das mit dem asort funktioniert..........
mfg Fat Freddys Dog
>
> - Sven Rautenberg
Moin!
Wie ist das mit foreach gemeint? Tschuldigung, bin absoluter Anfänger....
Dann mal ein ganz heißer Tipp: PHP liefert dir online eine Befehlserklärung, indem du ganz einfach folgende URL aufrufst:
www.php.net/BEFEHLSNAME
Und wenn du dich mal vertippst, kriegst du statt des Befehls eine Auswahlliste von zwanzig so ähnlich klingenden Befehlen.
Statt den Befehl in die URL zu tippen, kannst du ihn auch oben rechts in das Suchfeld tippen.
Also mal als Beispiel:
http://www.php.net/foreach
- Sven Rautenberg
Ich blicks nicht (ist im Moment ein Buch mit sieben siegeln), habe nachgeguckt und im moment sieht der code so aus?
<?
$datei = 'helge.txt';
$content = file_get_contents($datei);
<pre>
$doppelteWorte = preg_split('/[ ]+/',$content);
$gezaehlteWorte = array_count_values($doppelteWorte);
foreach($gezaehlteWorte as $key);
{
print_r(asort($key));
}
?>
</pre>
Moin!
Ich blicks nicht (ist im Moment ein Buch mit sieben siegeln), habe nachgeguckt und im moment sieht der code so aus?
Und was ist da jetzt dein Problem? Eine Fehlerbeschreibung ist unerläßlich.
Was erwartest du, was der Code tun soll? Was tut er tatsächlich? Was gefällt dir am Ergebnis nicht? Auch wenn du PHP-Anfänger bist: Es sollte dir möglich sein, in deinen eigenen Worten diese Fragen zu beantworten.
Denn nur wenn du weißt, was du willst, und das auch mal schriftlich festgehalten hast, kannst du feststellen, was am Erreichen dieses Ziels noch fehlt, bzw. wann du fertig bist. Betrachte es als Teil des Lernprozesses.
- Sven Rautenberg
ich erhalte mit foreach immer einen Wert plus eins. Erstens weiss ich nicht, was ich mit der Erhöhung soll, und zweitens kriege ich eine Alphabetische Sortierung als Ergebniss (Was aber nicht die Aufgabenstellung ist ich will absteigend nach häufigkeit sortieren??)
2. Ausserdem erhalte ich einen neuen Schlüssel dadurch wenn ich das richtig gelesen habe. Aber wozu brauche ich den neuen Schlüssel, wenn ich doch durch die Sortierung (asort) schon einen habe??????
danke für die Geduld, wenn es heute nichts mehr wird, werde ich erstmal pause machen, und mich später noch mal ans Problem hängen, vielleicht sehe ich ja gerade den Wald vor lauter Bäumen nicht;-)
mfg Fat Freddys Dog
Moin!
ich erhalte mit foreach immer einen Wert plus eins. Erstens weiss ich nicht, was ich mit der Erhöhung soll, und zweitens kriege ich eine Alphabetische Sortierung als Ergebniss (Was aber nicht die Aufgabenstellung ist ich will absteigend nach häufigkeit sortieren??)
Du wendest asort falsch an.
Schau dir die Befehlsbeschreibung und die Beispiele zu asort an. asort sortiert einmalig dein Array. Du hast aber folgenden Code:
$doppelteWorte = preg_split('/[ ]+/',$content);
$gezaehlteWorte = array_count_values($doppelteWorte);
foreach($gezaehlteWorte as $key);
{
print_r(asort($key));
}
Du hast eine Schleife, die alle Arrayelemente durcharbeitet - und das jeweilige Element sortierst du dann.
Abgesehen davon: Schmeiß doch bitte mal print_r auf den Müll. Diese Funktion listet dir formatiert einen Variableninhalt auf, ist aber nahezu ausschließlich zum Debuggen nutzbar, und nicht für vernünftige Textausgabe.
Benutze echo, wenn du Text ausgeben willst.
- Ausserdem erhalte ich einen neuen Schlüssel dadurch wenn ich das richtig gelesen habe. Aber wozu brauche ich den neuen Schlüssel, wenn ich doch durch die Sortierung (asort) schon einen habe??????
Du kriegst keine neuen Schlüssel. Die existierenden Schlüssel nach array_count_values() sind die gefundenen Worte. Die Werte sind die Anzahlen dieser Worte.
asort() sortiert die Werte des Arrays, und läßt die Zuordnung Wert<->Schlüssel intakt. Das ist wichtig, weil du sonst ja nicht mehr weißt, welches Wort das war, das am häufigsten vorkam.
Und die foreach-Schleife hat zwei Anwendungsmethoden. Die erste hast du benutzt - damit kriegst du aber nur den Wert aus dem Array. Die zweite Methode liefert dir den Wert UND den Schlüssel des Arrays.
- Sven Rautenberg