PHP Array implodieren, Trennen mit «Komma» und «und»

  • Heyo


    Ich würde gerne folgende Array: $array = array('Wert 1', 'Wert 2', 'Wert 3', 'Wert 4'); wie folgt aufgesplitet ausgeben:
    "Wert 1, Wert 2, Wert 3 und Wert 4". Also das das array implodiert wird und durch Kommas getrennt, das letzte Element das Arrays aber mit einem «und» mit dem Rest verbunden ist.


    Ganz allgemein: Wie kann man so etwas bewerkstelligen? Gibt es hier gewisse Funktionen welche mit u.U. weiterhelfen können?


    Gruss

  • Nö, da gibt es keine fertige Funktion, das musst du dir selber schreiben. Dürfte aber kein großes Problem sein.

  • Wow, was für eine wirklich hilfreiche und inhaltsreiche Antwort - vielen, vielen herzlichen Dank dafür. Jetzt verstehe ich natürlich, wie ich das bewerkstelligen kann.

  • Boah, jetzt denk' doch mal selber nach!!!


    Du willst beim implode das letzte Element des Arrays nicht benutzten, also einfach mit array_pop rausnehmen. Dann implode ausführen und " und " und das rausgenomme Element dranhängen.


    Ich ja so wahnsinnig schwer, da ist ist natürlich deutlich einfacher, dumme Sprüche vom Stapel zu lassen! :(


    In zwei Minuten erledigt:


    Ein Hexenwerk, oder? Sensationelle Programmierung würde ich sagen. Das bekommt man garantiert nicht hin, wenn man nicht Vollprofi ist. :(

  • anagramm, statt zu nörgeln und zu motzen hätteste ja mal die initiative ergeifen können und mal selber ein paar ideen posten können oderzumindest irgendwelche versuche, schliesslich sind wir hier ja eigentlich kein vorkau-forum...

  • Danach habe ich auch nicht gefragt. Wäre z.B. «Schau mal array_pop nach» gekommen, hätte ich das ganze auch wunderbar alleine herausgefunden - wie der liebe Gast da oben ja sagte, muss man dafür kein Vollprofi sein.

  • Wäre z.B. «Schau mal array_pop nach» gekommen, hätte ich das ganze auch wunderbar alleine herausgefunden


    Und wenn du einfach mal in der Doku nach den Array-Funktionen gesehen hättest, wäre uns dieser Thread erspart geblieben. Diese ganzen Ausreden kennen wir alle schon.

  • Wenn ihr beide jetzt im Glauben leben möchtet, ich hätte gehofft, dass mir jemand hier ein Script postet, dann tut das.


    Ich habe in der php-Doku sehr wohl nach arrays gesucht und dabei «end()» gefunden. Ich dachte ich könnte das letzte Element so rausnehmen, und dann per «unset()» das letzte Element löschen. Danach hätte ich die restlichen Elemente per implode in einer Kommaliste ausgegeben und das letzte Element mit einem «und» noch drangehängt. Leider gibt «end» aber nicht die Position im array aus (was ja bei unset() nötig wäre), sondern das letzte Element - also kann ich end() nicht für das Löschen richtig brauchen.
    Mit meiner Frage wollte ich also nur wissen, welche Funktionen da wohl nützlich wären - also array_pop, was aber bei "siehe auch" nie aufgetaucht ist.


    Ich finde es zudem sehr schade, dass ich mich als mehr als zweijähriges Mitglied hier noch immer so rechtfertigen muss - aber das scheint wohl ein allgemeines Problem zu sein.

  • was hat denn jetzt die dauer deiner mitgliedschaft damit am hut?
    wenn du in 10 jahren einen beitrag schreibst wirste auch nichts anderes zu hören bekommen.
    wenn du ja schon 2 jahre hier bist weisste ja dass wir hilfe zur selbsthilfe leisten und dass es hier darum geht eigeninitiative zu zeigen und was man bisher probiert hat oder welche bisherigen gedankengänge man hatte.


    wenn ich aufm schlauch steh und 0 ausblick hab dann teile ich auch vorab meine ideen mit und das obwohl ich über 4 jahre dabei bin und mod wuhuuu

  • Ich dachte mir, dass man dann davon ausgehen kann, dass diese Person nicht mehr nach solchen «Vorkau-Scripten» verlangt - aber du hast mich ja gerade des Besseren belehrt.
    Ja, ich hätte meine Idee oben vermutlich erst posten sollen - dachte aber, das spart etwas Zeit, da man mit meiner Idee ja sowieso nicht zum Ziel gekommen wäre - aber in Zukunft poste ich einfach alles, was ich schon habe. ;-)

  • Danach habe ich auch nicht gefragt. Wäre z.B. «Schau mal array_pop nach» gekommen, hätte ich das ganze auch wunderbar alleine herausgefunden - wie der liebe Gast da oben ja sagte, muss man dafür kein Vollprofi sein.


    Lol, als ob array_pop etwas mit dem Problem zu tun hätte. Mal im Ernst: Man muss nicht für jeden Mist eine array_-Funktion nutzen, manche Sachen sind einfach trivial mit einer Schleife und ein paar ifs machbar. Wer programmieren will, sollte schon verstehen, wie man mit for und if umgeht, um etwas zu berechnen. Scheint eine Unsitte von PHP-Programmierern zu sein, für alles irgendwelche array_* oder preg_* Funktionen zu benutzen.

  • In vielen Fällen ist es weniger leserlich, nicht performant, Randfälle sind weniger sichtbar o.ä. Prinzipiell natürlich kein Problem, es sollte nur kein Zwang sein. Was sollte denn z.B. das array_shift? Das macht doch einfach keinen Sinn. Und warum prüfst du, ob es ein Array ist, nicht aber, ob er leer ist?


    Ich würde es dann eher so machen (sofern ich implode nutzen möchte):

    PHP
    1. function myImplode(array $array)
    2. {
    3. if (count($array) == 0)
    4. return 'nichts';
    5. if (count($array) == 1)
    6. return $array[0];
    7. $last = array_pop($array);
    8. return implode(", ", $array) . " und " . $last;
    9. }


    Achja, temporäre Variablen für jeden Mist sind auch sone Unsitte, hilft niemandem (dein $result. $array und $string).


    PS:
    Ansonsten mein ich halt, dass es bedenklich ist, wenn man ein implode nicht selber implementieren kann, nur weil mans immer aus der Bibliothek genommen hat.

  • Und warum prüfst du, ob es ein Array ist, nicht aber, ob er leer ist?


    Du möchtest bestimmt noch mal genau hinsehen.

    Achja, temporäre Variablen für jeden Mist sind auch sone Unsitte, hilft niemandem


    Können wir uns darauf einigen, dass anagramm eher ein Anfänger ist? Wenn ja, dann können wir uns bestimmt auch darauf einigen, dass meine Schreibweise für Anfänger leichter zu lesen und zu debuggen ist, oder?


    Ich persönlich halte nicht viel davon, in einem Forum jeden Quellcode zu optimieren. Der OT hat sowieso schon Fragezeichen in den Augen.

  • Du möchtest bestimmt noch mal genau hinsehen.


    Ok, hab ich, dein Code geht davon aus, dass das Array nicht leer ist. Wenns leer ist, kommt Mist raus (is_array(array()) === true).


    Können wir uns darauf einigen, dass anagramm eher ein Anfänger ist? Wenn ja, dann können wir uns bestimmt auch darauf einigen, dass meine Schreibweise für Anfänger leichter zu lesen und zu debuggen ist, oder?


    Ich denke nicht, dass bedeutungslose Temporaries oder bedeutungslose Manipulationen (wie array_shift) das Verständnis erleichtern. Debug-Ausgaben mögen durch Temporaries erleichtert werden, einfacher zu verstehen ist es wohl trotzdem nicht. Ich wollte eben sagen, dass anagramm den falschen Ansatz hat, wenn er sagt, du hättest ihn auf array_pop doch hinweisen können. Es gibt nicht für alles sinnvolle Funktionen in der PHP-Bibliothek, nicht jede „Abstraktion“ ist hilfreich und manchmal muss man auch eine Schleife machen, das sollte auch ein Anfänger hinbekommen, ansonsten ist das ein einziges Zusammenflicken von Code.


    PS:
    Ach ja, noch eine Unsitte: bei Fehlern false zurückgeben.

  • So, du Oberschlauberger, der an allem was rumzunörgeln hat, was nicht vom ihm selber ist.


    Jetzt rate mal, was bei deiner Funktion rauskommt! Ich kann es dir sagen: Notice: Undefined offset: 0 in ...on line 8


    Super Herr Besserwisser, oder?


    Ach ja, noch eine Unsitte: bei Fehlern false zurückgeben.


    Ich habe ja schon immer gewusst, dass die Entwickler von PHP alle ahnungslos sind. Mensch, könnten die von dir lernen!

  • Achso, wenn du auf assoziative Arrays Rücksicht nehmen willst, nimm halt current, aber array_shift macht halt keinen Sinn. Schön ist das vmtl. alles nicht, weil PHP keine schöne Sprache ist, aber array_shift ist nunmal semantischer Unfug.


    Zitat

    Ich habe ja schon immer gewusst, dass die Entwickler von PHP alle ahnungslos sind. Mensch, könnten die von dir lernen!


    Ähm, das sind historische Relikte. Und ja, PHP ist nunmal dreckig und keine wunderbar konsistent designte Sprache, die Entwickler sind wohl technisch nicht ahnungslos, waren aber damals ahnungslos, womit es damit mal hingeht. Vllt. ist dir auch mal aufgefallen, dass etwa die neueren Sachen wie SPL und PDO stets Exceptions verwenden?


    PS:
    Du wirst ja wohl zugeben, dass PHP mitsamt der Standard-Bibliotheken, was Unstrukturiertheit und Inkonsistenzen angeht, sehr weit an der Spitze steht, das passiert nunmal, wenn man einer primitiven „Präprozessor“-Skriptsprache immer mehr Features verpasst und neue Konzepte hinzufügt und kompatibel bleiben will. Eine Argument über die Autorität der PHP-Entwickler ist hier wohl unangebracht.

  • Du machst doch immer auf ganz schlau, dann schreib doch mal einen PHP-Parser. Da ja alle anderen keine Ahnung haben, kannst ja nur du den optimalen Parser schreiben.


    Deine Überheblichkeit und Besserwisserei ist manchmal echt drollig.


    Und falls es dir nicht aufgefallen ist, es ging mir nicht um PHP, sondern darum, dass du du Lösungsansätze kritisierst und selber fehlerhafte Lösungen lieferst, aber so tust, als wenn nur deine Lösung die Richtige ist.

  • Häh? Was hat das mit PHP-Parsern zu tun??? Was soll „der optimale Parser“ sein? Wovon redest du?


    Mein Code funktioniert nicht mit assoziativen Arrays, das sagte ich ja, das macht deinen aber nicht leserlicher und die Beschwerde des Thread-Starters nicht sinnvoller. Möchte man assoziative Arrays unterstützen, geht dies wohl am einfachsten mit reset oder array_shift, aber du wirst wohl zugeben, dass das nicht schön ist? Und false zurückgeben ist nicht gerade guter Stil, zumal es 1. exceptions (wie es jede halbwegs moderne Sprache macht) und 2. ein eigenes Sprachkonstrukt für solche Typüberprüfungen gibt.


    PHP
    1. function first(array $array)
    2. {
    3. return reset($array);
    4. }


    :D :D


    PHP
    1. function myImplode(array $array)
    2. {
    3. if (count($array) == 0)
    4. return 'nichts';
    5. if (count($array) == 1)
    6. return first($array);
    7. $last = array_pop($array);
    8. return implode(", ", $array) . ' und ' . $last;
    9. }


    PS:
    Das klingt mehr so, als hättest du keine Ahnung von Parsern…