Sie befinden sich hier im Forenarchiv von phpforum.de wenn Sie direkt ins Forum möchten, klicken Sie bitte hier. Zur Startseite kommen Sie hier.

Get only the highest entries of an Array

Also das ist mein Problem:
I habe eine Textdatei namens "test.txt", die folgendes enthält:

Level 1|Jack|100
Level 2|Bob|120
Level 1|Tom|130
Level 1|Jimmy|140
Level 2|Russel|90

Es ist also eine sehr einfach kleine Text-Datenbank, die folgende Daten enthält: Das Level, Den Spielernamen und die erreichten Punkte.

Jetzt lese ich die datei z.b. folgendermaßen ein:
$player_data=file("test.txt");

Jetzt möchte ich allerdings aus dem array §player_data nur den Eintrag mit dem höchsten Punktestand aus jedem Level ausgeben:
Hier also:

Level 1|Jimmy|140
Level 2|Bob|120

Die Funktion müsste also den Array durchgehen und für alle darin vorkommende Level immer schauen, welches das höchste ergebnis war.

Kann mir hier irgendjemand nen denkanstoß geben? Um so ausgearbeiteter, um so besser natürlich:)
Hab schon vieles Probiert, aber komm auf keinen grünen Zweig, mir fällt jetzt auch kein weg mehr ein, wie man das überhaupt managed, das er checkt, das es verschiedene Level sind und für egal wie viele immer die höchste nimmt.

Hier gehts zum Orginal Eintrag "Get only the highest entries of an Array" im Forum

Antworten

Wieso schreibst Du in deinem deutschen Forum in Englisch?
Standard-Antwort:
Zitat aus den Forenregeln:
Zitat:
Crosspostings

Technisch gesehen sind in der verwendeten Software keine Crosspostings im wörtlichen Sinne möglich. Siehe Multiposts.

Multiposts


Hier sind zwei verschiedene Fälle zu unterscheiden. Multiposts innerhalb der Seite werden nicht toleriert. Hier wird jeder Beitrag bis auf den, in den das Posting thematisch am ehesten passt gelöscht. Im Wiederholungsfall wird ein Hinweis auf die Crossposting-Regelung des Forums hinterlassen und der Thread geschlossen.

Multiposts mit anderen Webforen als phpforum.de werden anders behandelt. Diese Threads werden mit einem Hinweis versehen und bei mehrmaligem Crossposten werden die Threads geschlossen.
Falls du dich fragst, ob das reine Schikane von uns ist, nein, hier der Grund:

Zitat:
Crossposting bedeutet, dass ein und dieselbe Frage in mehreren Foren oder Newsgroups gleichzeitig gestellt wird. Ein solches Verhalten wird von den meisten Helfern nicht toleriert, denn damit stellst Du einerseits die Kompetenz der Helfer jedes einzelnen Forums und Newsgroup in Frage und bewirkst zudem, dass ein zig-faches an Stunden aufgewendet wird, um nur ein einziges Problem zu lösen, denn überall werden sich die Helfer daran setzen, eine Lösung für Dich zu finden. Das ist ganz klar ein Missbrauch an dem kostenlosen und freiwilligen Support, der hier angeboten wird.
Wenn Deine Frage klar und deutlich gestellt wurde, dann wirst Du ganz bestimmt innerhalb kürzester Zeit eine Antwort erhalten. Sollte dies auch nach mehreren Tagen nicht der Fall sein, dann versuche bitte die Frage besser zu formulieren. Falls Du dennoch in einem zweiten Forum posten solltest, erwähne bitte, dass Du die Frage schon woanders gestellt hast, und dass Du es tust, weil keine Lösung gefunden werden konnte.
Siehe auch
http://www.phpforum.de/forum/phpforum2_Aktuelles__18987_1082551933.html
sowie
http://www.phpforum.de/forum/news.php?boardid=12


2.

schon array_multisort probiert?


3.

@fuckregistrierung: ähm jupp, aba das wollt net so ganz, oder hast du da eine etwas genauere anleitung beiseite, vllt. hab ich nur was falsch gemacht.

@Admin: OK, sorry, das mit dem englischen tut mir Leid, es war reine gewohnheit. Aber zum Crossposting-Punkt...das möcht ich stark anzweifeln, dank deinem Zitat/Regelauszug hast es dir selbst vermasselt, denn ja, diese Frage habe ich schon einmal gestellt, allerdings nicht gleichzeitig und sie wurde beim ersten mal einfach nicht beantwortet (0 responses) also ist es wohl mein gutes recht sie an anderer stelle noch einmals zu stellen...also, erstmal n gang runterschalten und locker bleiben.


4.

geht

achso before ich´s vergess RTFM, da habe ich es auch her

Code:                   In Zwischenablage kopieren (nur IE)
1">




5.

Dir ist aber bewusst, dass das eine Standardantwort für den Fall ist? Ich habe auch keine Ahnung wann und wo Du die Frage schonmal gestellt hast, nachdem Du es aber hier in Englisch reinkopiert hast erschien mir die Annahme es sei ein "Crosspost" mit einem anderen Forum/Newsgroup/Mailingliste durchaus realisitisch. Ich wollte Dich damit nur auf unsere Regeln aufmerksam machen. Kurz: wir haben in einem Fall wie dem hier, wenn Du woanders keine Hilfe bekommen konntest, nichts dagegen wenn Du hier nochmal postest. Nett wäre es aber, dazuzuschreiben dass Du das schonmal gefragt hast und keine Antwort bekamst.


6.

Zitat:
@fuckregistrierung: ähm jupp, aba das wollt net so ganz, oder hast du da eine etwas genauere anleitung beiseite, vllt. hab ich nur was falsch gemacht.
[doc]array_multisort[/doc]

Zitat:
@Admin: OK, sorry, das mit dem englischen tut mir Leid, es war reine gewohnheit.
Sehr gutes Argument, muss ich schon zugeben !

Zitat:
also ist es wohl mein gutes recht sie an anderer stelle noch einmals zu stellen
Hättest genau sogut dort nochmal fragen können.


7.

@fuckregistrierung: Danke für den Tipp, ich schau mir das mal an und guck ob es hinhaut, bzw. ich was draus machen kann.

@Admin: Für englische posts is die standart-antwort über Cross-Posts?
Aha....das ist mir nicht bekannt gewesen, naja, is ja au wurscht, ich bin net hier um zu streiten.

In diesem Sinne, danke erstmal


8.

Hm, ne, funzt, au net so ganz, des sortiert mir einfach nur alles nach der Punktezahl, egal welche level, also folgendes ergebnis:

Array
(
[0] => Array
(
[0] => Level 1
[1] => Jimmy
[2] => 140
)

[1] => Array
(
[0] => Level 1
[1] => Tom
[2] => 130
)

[2] => Array
(
[0] => Level 2
[1] => Bob
[2] => 120
)

[3] => Array
(
[0] => Level 1
[1] => Jack
[2] => 100
)

[4] => Array
(
[0] => Level 2
[1] => Russel
[2] => 90
)

)


9.

tja dann musst du es weiter modifizieren, nur wer´s selber macht lernt draus :D


10.

Der Algorhytmus müsste etwa so aussehen:

1.) Array $level definieren (assoziativ)
2.) dein Array durchgehen, und prüfen, ob das level schon in $level steht.
3.) Wenn ja, dann gucken, ob punktezahl höher ist, ob der wert im Array $level und eventuell überschreiben
4.) Wenn nein, anlegen, mit Punktzahl.

Ist nicht sondernlich kompliziert, aber ein wenig Schreibarbeit :)


11.

Ich gehe davon aus das du es schaffst ein array mit folgenden arrays zu erstellen:
Code:                   In Zwischenablage kopieren (nur IE)
2">

Achtung der Code ist frei geschrieben, auf Fehler mussu selbst achten!


12.

@fuckregistrierung: Ja, leider:)

@Johnpatcher: Verdammt, ja, danke, jetz sollte es klappen, hatte wohl ne rießen denkblokade, bin ums verrecken net draufgekommen. Das war mal n Denkanstoß der wirklich ma gefruchtet hat.


13.

oh ja könnte glatt ein 3 Zeiler werden...

Code:                   In Zwischenablage kopieren (nur IE)
3">

edit:
zulangsam :/


14.

@ Varon

Wow, das is echt perfekt und auch gleich noch ausgearbeitet....is viel viel besser als meines.
Allerdings für einen Anfänger wie mich no a bisserl schwer zu durchschauen.

Allerdings, da ich ja nicht weiß, für welche Level Daten in dem Array gespeichert sind, kann ich die Infos ja net mit
z.b. $new_array["Level 1"][0] abfragen. Es wäre besser wenn die Indizes des äußeren Arrays nicht z.b. "Level 1", "level 2" usw. wären, sonder schlicht numerisch, das man einfach quasi mit ner schleife($i) $new_array[$i][0] durchlaufen könnte.

Wäre es unverschähmt zu fragen, wie man es abändern könnte, dass sich der resultierende array so verhält:)?

Ach ja, und die geschwindigkeit ist absolut kei problem, da die ausgangsdatei im normalfall nicht viel mehr als 90-120 einträge enthält. (Oder hab ich dein "zulangsam :/" falsch verstanden, bzw. war es garnich darauf bezogen?)


15.

Zitat:
Wäre es unverschähmt zu fragen, wie man es abändern könnte, dass sich der resultierende array so verhält?
In meinen Augen schon, weil du im fortgeschrittenen Forum gepostet hast, und man dann sowas schon selber herausbekommen müsste.

Zitat:
Allerdings, da ich ja nicht weiß, für welche Level Daten in dem Array gespeichert sind, kann ich die Infos ja net mit
z.b. $new_array["Level 1"][0] abfragen. Es wäre besser wenn die Indizes des äußeren Arrays nicht z.b. "Level 1", "level 2" usw. wären, sonder schlicht numerisch, das man einfach quasi mit ner schleife($i) $new_array[$i][0] durchlaufen könnte.
Man kann doch auch mehrdimensionale Arrays in einer bzw. zwei Schleifen durchgehen, wo ist da das Problem ?


16.

Das mehrdimensional ist nicht das Problem , das $new_array["Level 1"][0] is das problem,
dass ich als index "Level 1" nehmen muss, da wäre ein Numerischer wert besser, also einfach $new_array[0][0].


17.

Und wieso ? So weißt du gleich welches Level gemeint ist, bei [0] nicht, und wenn die Daten willkürlich in der Datei sind, müsstest du dir noch ein paar Gedanken über die Sortierung machen. Wo ist das Problem bei einem assoziativen Array ?


18.

Zitat:
da wäre ein Numerischer wert besser,
Dann forms doch um!!

z.B. mit:
[doc]array_map,explode[/doc]


19.

Weil da wo "level 1" steht, in wirklichkeit der levelname steht, und ich nicht vorhersagen kann, welche level in der datei gespeichert sind...es können immerwieder neue dazukommen, deren namen das skript vorher nicht kennt. Also kann ich so schlecht darauf zugreifen.


20.

Dann sage mal, wie du etwas, was du nicht kennst, sortieren willst :D
Telepathie wird von PHP (noch) nicht beherscht :D


21.

Zitat:
es können immerwieder neue dazukommen, deren namen das skript vorher nicht kennt. Also kann ich so schlecht darauf zugreifen.
1.) wäre das mit einem nummerischen Array noch schlimmer und 2.) soll ja das Levelarray dynamisch erstellt werden !


22.

das ist recht einfach eigentlich, nach dem durchlauf der datei, weiß das skript ja, welche level darin gespeichert sind, und kann für jedes den eintrag mit der höchsten punktzahl nehmen. Und soweit ist das skript von Varon ja auch schon absolut perfekt, es ist exakt das was ich suche und arbeitet genial. Es wäre mir eben nur lieber gewesen am ende keinen assoziativen array zu erhalten der wiederum numerische arrays enthält, sondern einen numerischen, der indizierte enthält.

und @johnpatcher:
Zitat:
Und wieso ? So weißt du gleich welches Level gemeint ist
Das is ja net nötig weil es im inneren Array sowieso nochmal steht.


23.

Verstehe deine Problematik in keinster Weiße, aber wenn du ein assoziatives Array in ein numerisches umwandeln willst, dann wurden die Funktionen oben schon genannt. Das "Problem" ist nur, dass assoziative Arrays keine Sortierung haben, und numerische eben schon.


24.

Die Problematik besteht lediglich darin, dass im weiteren Verlauf es um einiges praktischer wäre, wenn der Array Numerisch wäre und nicht assoziativ.
Die Funktionen um ihn umzuwandel sind scho klar, es wäre mir nur lieber gewesen, wenn er von Anfang an als numerischer erstell würde.


25.

*total verwirrt*


26.

Ich versteh ihn auch nicht !

Zitat:
Die Funktionen um ihn umzuwandel sind scho klar, es wäre mir nur lieber gewesen, wenn er von Anfang an als numerischer erstell würde.
Dann ändere doch die Funktion, die du jetzt benutz ab, indem du die oben genannten Funktionen einbaust, wodurch dir die Funktion ein numerisches Array zurückliefert !


27.

Nur mal so zur info, das script von mir hällt dir in der Beziehung ALLES offen, ob du da jetzt das Level, oder die Punkte reinschreibst ist doch sowas von Latte!

Ausserdem sind die Scripte die hier gepostet werden rein als Anregung gedacht, und nicht um dir die Arbeit abzunehmen ;)

Also nimm die Anregungen, und Bastel dir das was du brauchst!


28.

Jo schon klar, hab nur nochmals Nachgefragt, weil es mich Anfangs etwas überfordert hat,
aber mittlerweile hat sich mein Problem jetz eh schon erledigt.


Hier gehts zum Orginal Eintrag "Get only the highest entries of an Array" im Forum
 
phpforum.de | Impressum