Mittagspausencontest: Aufzählen leicht gemacht

Heute habe ich mal wieder gemerkt, wie scheinbar selbstverständliche Aufgaben für Anfänger zu einer Herausforderung werden können. Die Aufgabe lautete, eine beliebige Anzahl von Elementen in einem String aufzuzählen und dabei das letzte statt mit einem Komma durch das Wort “und” zu verbinden. Die Aufgabe wurde dann natürlich noch gelöst.

Da es ja nicht sonderlich spannend ist, ein Schnipsel Beispielcode zu Bloggen, dachte ich mir daraus einfach einen Mittagspausen-Spaß-Contest daraus zu machen. Schreibt Code, der die Aufgabe löst, die Liste nicht verändert und dabei besonders ist. Also z.B. besonders kurz, besonders verrückt oder besonders “designverpattert”. Was auch immer, ob in den Kommentaren oder in eurem Blog.

Zu gewinnen gibt es außer Spaß leider nichts, aber ich hoffe trotzdem auf eine rege Teilnahme.

Ein hoffentlich anfängerfreundliches Beispiel könnte also so aussehen:

<?php
$elements = array('Apfel','Banane','Erdbeere','Birne');

$count = count($elements);

$str = '';
foreach ($elements as $index => $element) {
  if ($index > 0) {
    if ($index < ($count - 1)) {
      $str .= ', ';
    } else {
      $str .= ' und ';
    }
  }
  $str .= $element;
}

echo $str;  // Ausgabe: Apfel, Banane, Erdbeere und Birne

Ein anderer Weg wäre eine Lösung mit den Array-Funktionen, wobei hier aber durch array_pop() das Array verändert würde.

$lastElement = array_pop($elements);
echo implode(', ', $elements) . ' und ' . $lastElement;

Nun also ran an die Tasten und abschicken.

14 Kommentare

  1. Mein erster Ansatz beim Durchlesen wäre wohl auch per implode gewesen. Vllt bin ich aber in der Mittagspause noch etwas kreativer. Wie hat denn Dein Sprößling die Aufgabe gelöst?

    OT: Deine “Neben-Überschriften” sind einfach herrlich. Vielen Dank, habe gerade köstlich lachen müssen. Hier muss ich öfters vorbeischauen.

  2. Ich brauch drindend auch nen Blog :-) Aber so lang poste ich meinen Vorschlag mal hier. Ich hab mich an die “besonders kurz” Variante versucht:

    #!/usr/bin/php
    <?php
    $elements = array('Apfel', 'Banane', 'Erdbeere', 'Birne');
    echo preg_replace('#, (\w+)$#', ' und $1', implode(', ', $elements));

  3. Von mir:
    $elements=array(“Apfel”,”Banane”,”Erdbeere”,”Birne”);

    echo (implode(“,”,array_slice($elements,0,count($elements)-1)).” und “.$elements[count($elements)-1]);

  4. Ich habe es mal mit einer Rekrusiven funktion gemacht. So habe ich immer noch den Array zu verfügung und veränder ihn nicht.

    1){
    return $check ? ‘, ‘.array_shift($array).getList($array):array_shift($array).getList($array);
    }else{
    return ‘ und ‘.array_shift($array);
    }
    }
    $tmp=array(‘Apfel’,'Banane’,'Erdbeere’,'Birne’);
    echo getList($tmp,false);
    ?>

  5. Argh abgeschnitten:

    noch einmal:

    function getList($array,$check=true){
    if(count($array)>1){
    return $check ? ‘, ‘.array_shift($array).getList($array):array_shift($array).getList($array);
    }else{
    return ‘ und ‘.array_shift($array);
    }
    }
    $tmp=array(‘Apfel’,'Banane’,'Erdbeere’,'Birne’);
    echo getList($tmp,false);

  6. okurow nimmt mir den Code aus dem Mund, aber es gibt Optimierungspotential:

    $elements = array(‘Apfel’,'Banane’,'Erdbeere’,'Birne’);

    echo implode(‘, ‘, array_slice($elements, 0, $last = count($elements) – 1)) . ‘ und ‘. $elements[$last];

  7. @Sven, okurow: Und jetzt lassen wir es auch mit anderen Arrays als fortlaufend numerisch indizierten funktionieren:

    $elements = array('Apfel','Banane','Erdbeere',7=>'Birne');

    echo implode(', ', array_slice($elements, 0, count($elements) – 1)) . ' und '. end($elements);

  8. Nachtrag:

    hab nochmal drübergeschaut, so ist es besser

    $elements = array('Apfel','Banane','Erdbeere',7 => 'Birne');

    echo implode(', ', array_slice($elements, 0, –1)) . ' und '. end($elements);

  9. Mein Ansatz wäre hier folgender:

    <?php

    $elements = array('Apfel','Banane','Erdbeere','Birne');

    echo humanList($elements);

    $elements = array('Apfel');

    echo '’;
    echo humanList($elements);

    /**
    * lists an array for human readability
    *
    * @param array $elements the elements to list
    * @param string $addition ‘und’ or ‘oder’, something like that
    *
    * @return string $list e.g. ‘Apfel, Birne, Erdbeere und Banane’
    */
    function humanList(array $elements, $addition = ‘und’)
    {
    $list = ”;

    // if array contains only one value, return it as string
    if (count($elements) <= 1) {
    return (string) $elements[0];
    }

    // go through each element, but skip the last one
    for ($i = 0; $i < count($elements) – 1; $i++) {
    $list .= $elements[$i];

    // if the element is the next to last, add addition, otherwise add a comma
    $list .= ($i == count($elements) – 2)
    ? ' '.$addition.' '.$elements[$i + 1]
    : ', ';
    }

    return $list;
    }

  10. Na da haben wir ja schon ein paar Lösungen zusammen. Dann kann ich mir ja fürs nächste Mal eine echte Herausforderung ausdenken und noch ein paar Preise organisieren. :)

  11. .. auf jeden fall hast du einen neuen regelmässigen Leser :-)

    gefällt mir.

    Gruss aus Tegel ;-)

  12. Wann habt Ihr denn alle Mittagspause? ;) xD

    @Daniel: Mich hätte jetzt noch die Lösung von Deinem Sprößling interessiert.

  13. @Andi: Leider wollte er sie wohl nicht posten, obwohl ich ihn noch auf den Artikel aufmerksam gemacht habe, aber seine Lösung war meiner recht ähnlich. Das lag aber auch an der Vorgabe, wie er es lösen sollte.

    @okurow: Freut mich sehr, (fast) Nachbar. :)

    @all: Vielen Dank für eure Beiträge, mit so vielen hätte ich nicht gerechnet. Vielleicht klappt es ja zum nächsten Mal mit ein paar netten Preisen.

  14. Sorry, meine “Lösung” möchte ich euch nicht vorenthalten.

    $komma .= (next($_POST['wemerzaehlen'])) ? $value . “, ” : $value;

    echo ‘Sie würden ‘;

    $komma = “”;
    $vonuns = ‘ von uns erzählen.’;

    foreach ($_POST['wemerzaehlen'] as $key => $value)
    {
    if ($key == count($wemerzaehlen) -2)
    {
    $komma .= $value . ‘ und ‘;
    }
    else
    {
    if ($key == count($wemerzaehlen) -1)
    {
    $komma .= $value;
    }
    else
    {
    $komma .= $value . ‘, ‘;
    }
    }

    }
    echo $komma . $vonuns;

Schlagwörter: Adapter, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, AutoLoader, Bedienung, Bedingung, Benchmark, Bildbearbeitung, BOM, Bootstrap, Bot, Byte Order Mark, Callback, CamelCase, Canvas, Captcha, Cheatsheet, CLI, Closure, Cloud, CodeSniffer, Community, Comparator, Contest, Controller, Converter, CouchDB, Countable, Cronjob, CSV, CustomLibrary, Custom_Model, Data Mapper, Datei, Datenbank, Datenstruktur, Datentypen, Dating, Decorator, Dekorierer, Design Patterns, Dump, Duplikat, each, Eclipse, Entwicklung, Entwurfsmuster, Enum, Erweiterung, Eventhandling, Exception-Handling, Extension, Factory, Fehler, Flash, Foreach, Formatierung, Formular, Funktion, Futon, Header, HTML5, HTTP, IDE, If, Implementierung, InnoDB, Interceptor, Interface, isset, Iterator, Java, JavaScript, jQuery, Konfiguration, Konsole, Kontrollstruktur, kopieren, Late Static Binding, Layout, Linux, Listeners, Logging, Löschen, Magento, Magic Methods, Marketing, Methode, Model, MVC, MySQL, NetBeans, Objekt, Observable, Observer, OOP, Operator, Parameter, Partnersuche, Performance, PHP, phpMyAdmin, PHPUnit, Plugin, Proxy, Qualitätssicherung, Query, Reflection, Request, Response, Rest-API, Rockstar, Routing, S3, Samba, Scheifen, Schleife, Schutz, Secure Shell, Selbstreferenz, Shop, Sicherheit, Sicherung, Singleton Pattern, SOAP, Sortierung, Sourcecode, Spam, Speicherproblem, Spickzettel, SPL, SSH, Statement, Stellvertreter, Strategy Pattern, Stream, String, Sun VirtualBox, Support, Switch, Symfony, Symfony2, Symfony Live, Tag, Template, Template Method, Ternär Operator, Testing, Thumbnail, Tool, Tour, Twig, Type-Cast, Umwandlung, Underscore, unset, Vererbung, Verzweigung, Video, Videospiel, Virtualisierung, Visitor Pattern, Vorschaubild, walk, Webserver, Webservice, Weiterleitung, Wrapper, Youtube, Zeitsteuerung, Zend Framework, Zend_Cloud, Zend_CodeGenerator, Zend_Http_Client, Zend_Service, Zugriffsmethode