Pit: Funktion gesucht

Hallo,

ich möchte in php aus einem String:

Peter, Tom, Chris, Hans

folgenden String machen:

'Peter','Tom','Chris','Hans'

und auch aus:

Peter
'Peter'

zugleich soll der String, so er denn leer ist, auch nach dem Behandeln leer sein, also nicht z.b. '' daraus werden.

Wie mache ich das am effizientesten?

Pit

  1. Hallo

    ich möchte in php aus einem String:

    Peter, Tom, Chris, Hans
    

    folgenden String machen:

    'Peter','Tom','Chris','Hans'
    

    Teiloe die Zeichenkette mit explode an den Kommata …

    und auch aus:

    Peter
    
    'Peter'
    

    … und fasse die einzelnen Zeichenketten in ' ein.

    zugleich soll der String, so er denn leer ist, auch nach dem Behandeln leer sein, also nicht z.b. '' daraus werden.

    Prüfe mit empty, ob die Variable oder die Arrayelemente leer sind. Nur, wenn sie nicht leer sind, führe die vorher angesprochenen Schritte aus.

    Tschö, Auge

    --
    Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
    Toller Dampf voraus von Terry Pratchett
    1. Hallop Auge,

      … und fasse die einzelnen Zeichenketten in ' ein.

      Auch hier: Ich weiß nicht, wie ich das mache.

      Prüfe mit empty, ob die Variable oder die Arrayelemente leer sind. Nur, wenn sie nicht leer sind, führe die vorher angesprochenen Schritte aus.

      Darf man empty() auch auf Arrays anwenden? Ich zähle bisher immer die Elemente…

      Pit

      1. Hallo

        … und fasse die einzelnen Zeichenketten in ' ein.

        Auch hier: Ich weiß nicht, wie ich das mache.

        Stichworte: „Stringverkettung“ oder „String Concatenation“

        Prüfe mit empty, ob die Variable oder die Arrayelemente leer sind. Nur, wenn sie nicht leer sind, führe die vorher angesprochenen Schritte aus.

        Darf man empty() auch auf Arrays anwenden?

        Ja, das darf man. Das nützt dir in deiner Aufgabenstellung aber nichts. Du willst wissen, ob eines der Arrayelemente eine leere Zeichenkette ist, nicht, ob das Array als ganzes leer ist.

        Ich zähle bisher immer die Elemente…

        Dann weißt du aber nur, wie viele Elemente das Array hat. Ob eines davon leer ist, weißt du so nicht.

        $stringNamen = 'Peter, Tom, Chris,, Hans'; # beachte die beiden Kommata hinter Chris
        $arrayNamen = explode(',', $stringNamen); # zerlege den String, Trennzeichen ist das Komma
        
        # var_dump gibt die Elemente der Variable mit Typ und Inhalt aus
        # zwischen Chris und Hans wird ein leeres Arrayelement vorhanden sein
        var_dump($arrayNamen);
        
        foreach ($arrayNamen as $name) {
            # bearbeite das Arrayelement nur, wenn es nicht leer ist
            if (!empty($name)) {
            # fasse den Namen in Anführungszeichen ein
            }
        }
        

        Tschö, Auge

        --
        Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
        Toller Dampf voraus von Terry Pratchett
  2. Tach!

    ich möchte in php aus einem String:

    Peter, Tom, Chris, Hans
    

    folgenden String machen:

    'Peter','Tom','Chris','Hans'
    

    Explodieren am Komma, oder Komma plus Leerzeichen, vielleicht mit preg_split(), da kann man das Leerzeichen optional machen. Dann implodieren mit ',' als Glue und in ' einrahmen.

    und auch aus:

    Peter
    
    'Peter'
    

    Klappt damit auch.

    zugleich soll der String, so er denn leer ist, auch nach dem Behandeln leer sein, also nicht z.b. '' daraus werden.

    Hmm, diese Ausnahme kannst du hinterher finden, wenn '' das Ergebnis ist, dann durch Leerstring austauschen. Oder nach dem Explode testen, ob das Array leer ist und dann abbrechen.

    dedlfix.

    1. Hi dedlfix,

      Explodieren am Komma, oder Komma plus Leerzeichen, vielleicht mit preg_split(), da kann man das Leerzeichen optional machen. Dann implodieren mit ',' als Glue und in ' einrahmen.

      Habe mir schon gedacht, dass das auf einen ex- und einen implode hinausläuft, aber ich weiß nicht, wie ich das Einrahmen in die ' machen muß.

      Pit

      1. Habe mir schon gedacht, dass das auf einen ex- und einen implode hinausläuft, aber ich weiß nicht, wie ich das Einrahmen in die ' machen muß.

        Ah, gerade gefunden:

        <?php
            $a1 = array("1","2","3");
            $a2 = array("a");
            $a3 = array();
           
            echo "a1 is: '".implode("','",$a1)."'<br>";
            echo "a2 is: '".implode("','",$a2)."'<br>";
            echo "a3 is: '".implode("','",$a3)."'<br>";
        ?>
        
        will produce:
        ===========
        a1 is: '1','2','3'
        a2 is: 'a'
        a3 is: ''
        

        Pit

      2. Tach!

        Habe mir schon gedacht, dass das auf einen ex- und einen implode hinausläuft, aber ich weiß nicht, wie ich das Einrahmen in die ' machen muß.

        $result = "'" . implode("','", $exploded_array) . "'";
        

        dedlfix.

        1. Hallo dedlfix,

          schlaue Idee, ich hätte jeden einzelnen Teilstring mit array_map oder einer for-Schleife in Hochkommata eingerahmt.

          Aber eine gewisse innere Verarbeitung braucht man doch, denn Pit möchte ja folgendes NICHT:

          «Apfel , Pflaume, Birne» --> «'Apfel ',' Pflaume',' Birne'»

          sondern

          «Apfel , Pflaume, Birne» --> «'Apfel','Pflaume','Birne'»

          Dafür würde ich array_map vorschlagen wollen, das spart die eigene Schleife.

          function putInQuotes($list) {
              if (trim($list) == "") return $list;
              
              return "'".
                     implode(array_map(function($p) { return trim($p); },explode(",", $list)),"','").
                     "'";
          }
          

          Wem die Schachtelung der Funktionsaufrufe zu wüst ist, hier die Version mit Temp-Veriablen und Kommmentaren

          function putInQuotes($list) {
              if (trim($list) == "") return $list;
          
              // String an den Kommata auftrennen
              $parts = explode(",", $list);
              // Die einzelnen Teile mit trim() von Rand-Leerstellen befreien
              $quotedParts = array_map(function($x) { return trim($x) }, $parts);
              // Mit Hochkommas wieder zusammensetzen
              return "'".implode($quotedParts, "','")."'";
          }
          

          Rolf

          --
          sumpsi - posui - clusi
          1. Tach!

            Aber eine gewisse innere Verarbeitung braucht man doch, denn Pit möchte ja folgendes NICHT:

            «Apfel , Pflaume, Birne» --> «'Apfel ',' Pflaume',' Birne'»

            sondern

            «Apfel , Pflaume, Birne» --> «'Apfel','Pflaume','Birne'»

            preg_split() existiert und hab ich auch statt explode() vorgeschlagen. Nimmst du \s*,\s* als Suchmuster für den Split und erledigt ist der Fall mit dem Trimmen.

            dedlfix.

  3. @@Pit

    Ist man hier nicht mit einem regulären Ausdruch am besten dran?

    $s1 = 'Peter, Tom, Chris, Hans';
    $s2 = preg_replace('/([, ]*)([^,]+)/', '$1\'$2\'', $s1);
    

    LLAP 🖖

    --
    “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory