heinetz: Variablen in String

Hallo Forum,

in einem PHP-File steht folgendes:

<? foreach (array('a', 'b', 'c') as $item){ ?> <span><?=$item;></span> <? } //Ausgabe //<span>a</span> //<span>b</span> //<span>c</span> ?>

Ich habe folgendes versucht:

<? $html = '<span><?=$item;></span>'; foreach (array('a', 'b', 'c') as $item){ ?> echo $html; } echo $html; ?>

… weil ich folgende Ausgabe benötige:

//Ausgabe //<span>a</span> //<span>b</span> //<span>c</span> //<span></span>

Warum das nicht funktioniert ist mir schon klar. Mir fallen zwei Möglichkeiten ein, wie das funktionieren würde:

a) ich schreibe eine Funktion html($item) die den Inhalt von $html zurückgibt und ersetze "echo $html" durch "echo html($item)"

b) ich schreibe den Inhalt von $html in ein externes File "html.php" und ersetze "echo $html" durch include "html.php";

Beides gefällt mir nicht. Gibt'S was einfacheres?

gruss, heinetz

  1. Lieber heinetz,

    wenn Du Variablen in Strings "ausgegeben" haben willst, dann ist das entweder "quick and dirty" auf diese zwei Arten machbar:

    • $str = "String mit $variable Sachen.";
    • $str = 'String mit '.$variable.' Sachen.';

    Dazu muss man wissen, dass die doppelten Anführungszeichen von PHP anders behandelt werden, als einfache.

    Die "saubere" Art wäre wohl folgende:

    $str = [sprintf](http://php.net/manual/en/function.sprintf.php)(     "String mit %s Sachen.",     $variable );

    Liebe Grüße,

    Felix Riesterer.

    -- "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
    1. @@Felix Riesterer:

      Die "saubere" Art wäre wohl folgende:

      $str = [sprintf](http://php.net/manual/en/function.sprintf.php)( >     "String mit %s Sachen.", >     $variable > );

      Wohl nicht ganz, weil inflexible Syntax. Schon wieder vergessen?

      Klementine* sagt: Nicht nur sauber, sondern rein!

      $str = [sprintf](http://php.net/manual/en/function.sprintf.php)(     "String mit %1$s Sachen.",     $variable );

      Bei einer auszugebenden Variablen wäre es freilich egal, aber: 1. ist es unsinnig, zwei verschiedene Syntaxen für eine vs. mehrere Variablen zu verwenden, und 2. kann man nicht sicher sein, dass nicht irgendwann noch eine zweite Variable hinzukommt.

      LLAP

      • Kennt die außer mir noch wer? Oder bin ich alt?
      -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      1. Hallo Gunnar,

        • Kennt die außer mir noch wer? Oder bin ich alt?

        ja und ja :)

        Gruß, Jürgen

      2. Lieber Gunnar Bittersmann,

        weil inflexible Syntax. Schon wieder vergessen?

        für ein multilinguales Projekt würde ich von vornherein anders vorgehen. Aber auf welchem Level argumentiert denn der OP?

        Klementine* sagt: Nicht nur sauber, sondern rein!

        War das Ariel ultra? Die Frau mit dem Kopftuch und den hochgekrempelten Ärmeln?

        • Kennt die außer mir noch wer? Oder bin ich alt?

        Ja und ja.

        $str = [sprintf](http://php.net/manual/en/function.sprintf.php)( >     "String mit %1$s Sachen.", >     $variable > );

        Bei einer auszugebenden Variablen wäre es freilich egal, aber: 1. ist es unsinnig, zwei verschiedene Syntaxen für eine vs. mehrere Variablen zu verwenden, und 2. kann man nicht sicher sein, dass nicht irgendwann noch eine zweite Variable hinzukommt.

        Ich wollte auch zuerst %1$s anstatt %s notieren, habe es mir aber anders überlegt, da der OP diese Funktion und ihre Ersetzungssyntax wahrscheinlich erst studieren muss. Warum etwas Neues gleich in seiner ganzen erschlagenden Komplexität präsentieren, anstatt scheibchenweise, damit ein Neuling hineinwachsen kann?

        Der Kontextwechsel ist mir allerdings durch die Lappen gegangen... :-/

        LLAP

        Hast Du im Andenken an Nimoy vorübergehend die Spezies gewechselt?

        Liebe Grüße,

        Felix Riesterer.

        -- "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
        1. @@Felix Riesterer:

          für ein multilinguales Projekt würde ich von vornherein anders vorgehen.

          Wie gesagt

          Klementine* sagt: Nicht nur sauber, sondern rein!

          War das Ariel ultra?

          „Ultra“ war damals noch nicht hip.

          Die Frau mit dem Kopftuch und den hochgekrempelten Ärmeln?

          Basecap war damals schon hip.

          • Kennt die außer mir noch wer? Oder bin ich alt?

          Ja und ja.

          Hehe, nicht ! ;-)

          Warum etwas Neues gleich in seiner ganzen erschlagenden Komplexität präsentieren, anstatt scheibchenweise, damit ein Neuling hineinwachsen kann?

          .

          LLAP

          Hast Du im Andenken an Nimoy vorübergehend die Spezies gewechselt?

          Das ist unlogisch. Nur weil ich ein mit paar Brocken Klingonisch um mich werfe, schlussfolgerst du, ich sei Klingone?

          Mein Klingonisch ist auf dem Niveau meines Lateins. Ich kann Phrasen dreschen (die lateinischen meist aus Asterix-Comics), mehr nicht.

          LLAP

          -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      3. Tach!

        Klementine* sagt: Nicht nur sauber, sondern rein!

        YAGNI!

        Bei einer auszugebenden Variablen wäre es freilich egal, aber: 1. ist es unsinnig, zwei verschiedene Syntaxen für eine vs. mehrere Variablen zu verwenden, und

        1. ist es unsinnig, um der reinen Bedienung eines Prinzips willen wegen mehr Code zu schreiben als notwendig. Mehr Code, mehr Fehlerquellen.
        1. kann man nicht sicher sein, dass nicht irgendwann noch eine zweite Variable hinzukommt.
        1. kann man an der Stelle die Variable gleich in die richtige Reihenfolge einfügen. Es gibt keinen Vorteil, dort eine Nummerierung zu verwenden, wenn man die Variablen in beliebiger Reihenfolge übergeben kann, diese also nicht wie bei zum Beispiel vpsrintf() durch eine Arrayreihenfolge vorgegeben ist. Die Reihenfolge muss eventuell ein Übersetzer beachten, weil die andere Sprache eine andere Anordnung benötigt. Das ist ein anderer Ort und muss mich an der Stelle nicht tangieren. Das Weglassen der Zahlen hier behindert nicht die passende Anordnung anderenorts.

        dedlfix.

        1. @@dedlfix:

          1. ist es unsinnig, um der reinen Bedienung eines Prinzips willen wegen mehr Code zu schreiben als notwendig.

          Zwei Zeichen mehr jetzt „mehr Code“ zu nennen – DAS ist Prinzipienreiterei.

          Mehr Code, mehr Fehlerquellen.

          Mehr Syntaxen, mehr Fehlerquellen.

          Die Reihenfolge muss eventuell ein Übersetzer beachten, weil die andere Sprache eine andere Anordnung benötigt.

          Ja. Aber dazu müssen ihm die Mittel in die Hand gegeben werden.

          Das ist ein anderer Ort und muss mich an der Stelle nicht tangieren.

          Doch, das muss es.

          Und wie ich schon sagte, muss man gar nicht in die Ferne schweifen.

          LLAP

          -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. Tach!

            Zwei Zeichen mehr jetzt „mehr Code“ zu nennen – DAS ist Prinzipienreiterei.

            Gut, dann reiten wir mal auf dem Prinzip weiter. Da wir ja flexibel sein wollen, kommen wir nicht umhin, die komplexest mögliche Syntax zu verwenden, um alle möglichen Probleme lösen zu können. Und dann verwenden wir auch nur diese, damit wir uns den Mischmasch aus einfacher und komplexer Syntax sparen. Gute Idee!

            Die Reihenfolge muss eventuell ein Übersetzer beachten, weil die andere Sprache eine andere Anordnung benötigt.

            Ja. Aber dazu müssen ihm die Mittel in die Hand gegeben werden.

            Die hat er doch. Er hat den Originaltext und weiß in welcher Reihenfolge die Werte kommen. Er kann die Zahlen nach seinem Bedürfnissen vergeben. Er braucht dazu keine Zahlen im Originaltext. Wenn er von der Syntax keine Ahnung hat, muss er eingewiesen werden.

            Was ist dein Ziel, das Nachdenken zu vermeiden? Das solltest du vermeiden, gerade weil du älter wirst. Gehirn anstrengen ist gut gegen diese Krankheit ... wie hieß die noch gleich?

            LLAP

            Spock brauchte keine Prinzipien.

            dedlfix.

            1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

              ja!

              Gut, dann reiten wir mal auf dem Prinzip weiter. Da wir ja flexibel sein wollen, kommen wir nicht umhin, die komplexest mögliche Syntax zu verwenden, um alle möglichen Probleme lösen zu können. Und dann verwenden wir auch nur diese, damit wir uns den Mischmasch aus einfacher und komplexer Syntax sparen. Gute Idee!

              Gab es da nicht eine Sicherheitlücke bei "sprintf()"?

              http://openbook.rheinwerk-verlag.de/linux_unix_programmierung/Kap18A-006.htm

              Spirituelle Grüße Euer Robert

              -- Möge der Forumsgeist wiederbelebt werden!
              1. Lieber Robert R.,

                Gab es da nicht eine Sicherheitlücke bei "sprintf()"?

                http://openbook.rheinwerk-verlag.de/linux_unix_programmierung/Kap18A-006.htm

                das bezog sich meines Wissens auf die Sprache C, wir sind hier aber in PHP. Mir ist jetzt nicht bekannt, inwiefern sprintf in PHP lediglich ein Wrapper für die originale C-Funktion ist, oder ob es da noch einen kleinen Filter bei den Argumenten gibt.

                Liebe Grüße,

                Felix Riesterer.

                -- "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
            2. @@dedlfix:

              Gut, dann reiten wir mal auf dem Prinzip weiter. Da wir ja flexibel sein wollen, kommen wir nicht umhin, die komplexest mögliche Syntax zu verwenden, um alle möglichen Probleme lösen zu können.

              Ja, die Weltformel! </Polemik>

              Aber von mir aus muss es '%s' gar nicht geben. Und man muss niemandem erzählen, dass es das gibt.

              Die hat er doch. Er hat den Originaltext und weiß in welcher Reihenfolge die Werte kommen. Er kann die Zahlen nach seinem Bedürfnissen vergeben. Er braucht dazu keine Zahlen im Originaltext. Wenn er von der Syntax keine Ahnung hat, muss er eingewiesen werden.

              Wie ich sagte: Not their job.

              Ein Übersetzer soll übersetzen, nicht PHP-Code verstehen. So hieße er ja Interpreter. ;-)

              Was ist dein Ziel, das Nachdenken zu vermeiden?

              Es geht nicht darum, wozu ich in der Lage bin, bei Übersetzungen zu beachten. Sondern wozu Übersetzer in der Lage sind.

              Das solltest du vermeiden, gerade weil du älter wirst. Gehirn anstrengen ist gut gegen diese Krankheit ... wie hieß die noch gleich?

              In der deutschen Fassung hieß Pon Farr „Weltraumfieber“. Meinst du das?

              LLAP

              -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
              1. Tach!

                Wie ich sagte: Not their job. Ein Übersetzer soll übersetzen, nicht PHP-Code verstehen. So hieße er ja Interpreter. ;-)

                Manchmal bist du schwer zu verstehen. Du warst das doch, der das mit der Filterblase zitiert hat, die Facebook usw. um die Nutzer legt und die verhindert, dass man über seinen Tellerrand hinausschauen kann? Andererseits argumentierst du hier genau in die gleiche Richtung. Nicht sein Job, liegt außerhalb seines Tellerrands. Ist denn die Filterblase doch gar nicht so schlimm?

                Wenn der Übersetzer keinen PHP-Code verstehen muss, warum konfrontierst du ihn überhaupt mit solchen %1$s-Monstern? Meinst du, er ist überhaupt in der Lage, das Konzept mit dem Platzhaltern zu verstehen? Erklären darf man es ihm nicht. Es besteht die Gefahr, dass er vom Tellerrand fällt. Und überhaupt, alle anderen sind sowieso Idioten.

                dedlfix.

                1. @@dedlfix:

                  Manchmal bist du schwer zu verstehen. Du warst das doch, der das mit der Filterblase zitiert hat, die Facebook usw. um die Nutzer legt und die verhindert, dass man über seinen Tellerrand hinausschauen kann? Andererseits argumentierst du hier genau in die gleiche Richtung. Nicht sein Job, liegt außerhalb seines Tellerrands. Ist denn die Filterblase doch gar nicht so schlimm?

                  Über den Tellerrand schauen ist nie verkehrt.

                  Du willst dem Übersetzer aber vorschreiben, in welche Richtung er zu schauen hat: auf deinen Teller.

                  Wenn der Übersetzer keinen PHP-Code verstehen muss, warum konfrontierst du ihn überhaupt mit solchen %1$s-Monstern? Meinst du, er ist überhaupt in der Lage, das Konzept mit dem Platzhaltern zu verstehen?

                  Ja, sollte er sein. Und %1$s sollte da nicht schwerer zu verstehen sein als %s. Es beantwortet sogar schon die Frage, die sich unweigerlich bei seiner Arbeit stellen wird: was der Übersetzer tun muss, wenn der die Reihenfolge der Variablen in dem String anders sein muss.

                  Wenn sich die Frage erst dann stellt, wenn niemand in der Nähe ist, der sie beantworten kann, ist das schon blöd.

                  LLAP

                  -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                  1. Tach!

                    Du willst dem Übersetzer aber vorschreiben, in welche Richtung er zu schauen hat: auf deinen Teller.

                    Und? Was ist daran so verwerflich, dass ich mir einen Übersetzer suche, der meine Anforderungen erfüllen kann? Meinst du, keiner wäre in der Lage, sich im Zweifelsfall auf der Tischdecke zu treffen? Ist es überhaupt angebracht, ihm die Texte in computerlesbarer Form zu übermitteln oder sollte ich doch lieber Papier nehmen?

                    Wenn sich die Frage erst dann stellt, wenn niemand in der Nähe ist, der sie beantworten kann, ist das schon blöd.

                    Ja, am besten setzt man sich nebeneinander hin. Es kann schließlich auch sein, dass sich der Originaltext nicht zweifelsfrei eindeutig übersetzen lässt und deshalb Rückfragen notwendig sind. Schon blöd, wenn er sich gezwungen sähe, sich eines Kommunkikationsgerätes zu bedienen, um das mit dem Auftraggeber zu klären.

                    dedlfix.

                    1. @@dedlfix:

                      Und? Was ist daran so verwerflich, dass ich mir einen Übersetzer suche, der meine Anforderungen erfüllen kann?

                      Hältst du es wirklich für sinnvoll, deine Anforderungen durch die Verwendung von %s statt %1$s künstlich hochzuschrauben?

                      Ist es überhaupt angebracht, ihm die Texte in computerlesbarer Form zu übermitteln oder sollte ich doch lieber Papier nehmen?

                      Immer dieses neumodische Zeugs! Bitte in Stein gemeißelt. Wahlweise auch in Knochen.

                      Ja, am besten setzt man sich nebeneinander hin.

                      Designer und Entwickler – ja. Übersetzer und Entwickler – sollte i.d.R. nicht notwendig sein. Es sei denn, der Entwickler baut eine solche Notwendigkeit ein. Und gerade das sollte man vermeiden.

                      Es kann schließlich auch sein, dass sich der Originaltext nicht zweifelsfrei eindeutig übersetzen lässt und deshalb Rückfragen notwendig sind.

                      Richard Ishida kann ein Lied davon singen, wieviele Rückfragen ich stelle, wenn ich seine Artikel übersetze. ;-)

                      LLAP

                      -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      4. Hi,

        Klementine* sagt: Nicht nur sauber, sondern rein! * Kennt die außer mir noch wer?

        ja sicher, aber ich hatte sie jetzt erst wieder mit "Sie baden gerade Ihre Hände darin" verwechselt. Eine ähnlich sympathische Erscheinung. So sympathisch, dass beinahe das Frühstück auch noch mal sehen will, was hier los ist.

        Oder bin ich alt?

        Wenn du schon so fragst ... ;-)

        Ciao,  Martin

        -- Mir geht es gut. Ich mag die kleinen Pillen, die sie mir dauernd geben. Aber warum bin ich ans Bett gefesselt? Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

          ja!

          Klementine* sagt: Nicht nur sauber, sondern rein! * Kennt die außer mir noch wer?

          ja sicher, aber ich hatte sie jetzt erst wieder mit "Sie baden gerade Ihre Hände darin" verwechselt.

          Das war doch "Tilly" https://www.youtube.com/watch?v=dRznUl4di8A

          Da hat man als (angehender) Mann garantiert keinen mehr hoch gekriegt und hatte deshalb Zeit zum Spülen.

          Spirituelle Grüße Euer Robert

          -- Möge der Forumsgeist wiederbelebt werden!
    2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

      ja!

      • $str = "String mit $variable Sachen.";
      • $str = 'String mit '.$variable.' Sachen.';

      Dazu muss man wissen, dass die doppelten Anführungszeichen von PHP anders behandelt werden, als einfache.

      Die "saubere" Art wäre wohl folgende:

      $str = [sprintf](http://php.net/manual/en/function.sprintf.php)( >     "String mit %s Sachen.", >     $variable > );

      Das ist aber noch beides sehr dirty! Wo belibt da die Kontextbehandlung?

      Außerdem kann man doch auf jedes Element des Arrays gezielt zugreifen über seinen Index. Und wenn man den nicht kennt, kann man - mitzählen - sich einzelne Elemente merken - die Funktionen end() und reset() benutzen http://php.net/manual/de/function.end.php   die das Array unverändert lassen, oder auch array_pop() und array_shift(),   http://php.net/manual/de/function.array-pop.php, die dann aber das gelieferte Element   auch aus dem Array entfernen.

      Ich würde dazu tendieren, für die gesamte HTML-Ausgabe dieser unspezifizierten <span>-Elemente eine besser spezifizierte zu bauen und die dann in eine Funktion zu packen, die den gesamten HTML-Block als String liefert. Mit passendem Namen versehen, könnte man das entstehnde Skript dann später vielleicht sogar noch lesen :-P

      Spirituelle Grüße Euer Robert

      -- Möge der Forumsgeist wiederbelebt werden!
  2. Tach!

    Beides gefällt mir nicht. Gibt'S was einfacheres?

    Einfacher als deine Ausgangslage wird es nicht. Was gefällt dir denn an der nicht? Mir würde daran nur missfallen, dass da anscheinend ein htmlspecialchars() fehlt.

    Deine Umgehungslösungen versuchen eine Variable zu verwenden, die aber erst zu einem späteren Zeitpunkt aufgelöst werden soll. Sowas geht nur mit eval() und das will man nicht verwenden.

    dedlfix.

  3. @@heinetz:

    in einem PHP-File steht folgendes:

    <? > foreach (array('a', 'b', 'c') as $item){ > ?> > <span><?=$item;></span> > <? > } > ?>

    Sollte aber nicht, sondern:

    [code lang=php]<? foreach (array('a', 'b', 'c') as $item): ?>   <span><?= $item ?></span> <? endforeach; ?>[/code]

    Siehe meine Diskussion mit Dem Martin (TL;DR)

    Und .

    Und '<?php' statt '<?'. ('<?=' ist OK.)

    [code lang=php]<?php foreach (array('a', 'b', 'c') as $item): ?>   <span><?= htmlspecialchars($item) ?></span> <?php endforeach; ?>[/code]

    LLAP

    -- „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. Moin

      Sollte aber nicht, sondern:

      [code lang=php]<? foreach (array('a', 'b', 'c') as $item): ?>   <span><?= $item ?></span> <? endforeach; ?>[/code]

      Danke... endlich mal ein weiterer Verfechter dieser alternative Schreibweise von Kontrollstrukturen. Ich habe sie mir angewöhnt und mag nicht mehr drauf verzichten.

      Gruß Bobby

      -- -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
  4. … weil ich folgende Ausgabe benötige:

    //Ausgabe > //<span>a</span> > //<span>b</span> > //<span>c</span> > //<span></span>

    müsste nicht folgendes gehn?

    <? foreach (array('a', 'b', 'c', '') as $item){ ?> <span><?=$item;></span> <? } ?>