Klaus: Daten mit PHP ausgeben

Hallo,

wenn ich mein

print_r($result);

anschaue erhalte ich folgende Ausgabe

stdClass Object
(
    [GetCountriesResult] => stdClass Object
        (
            [Country] => Array
                (
                    [0] => stdClass Object
                        (
                            [id] => 8
                            [name] => Belgien
                            [iso1] => BE
                            [iso2] => BEL
                        )

                    [1] => stdClass Object
                        (
                            [id] => 24
                            [name] => Dänemark
                            [iso1] => DK
                            [iso2] => DNK
                        )

                )

        )

)

Die Frage, die ich jetzt habe ist, wie kann ich dieses mit PHP ausgeben lassen?

  1. Hallo,

    wenn
    print_r($result);

    Die Frage, die ich jetzt habe ist, wie kann ich dieses mit PHP ausgeben lassen?

    Kannst du deine Frage so stellen, dass sie sich nicht mit deiner Voraussetzung beantworten lässt? Wir sind hier doch nicht bei Jeopardy.

    Gruß
    Kalk

  2. Tach!

    wenn ich mein

    print_r($result);
    

    anschaue erhalte ich folgende Ausgabe [...] Die Frage, die ich jetzt habe ist, wie kann ich dieses mit PHP ausgeben lassen?

    Ist doch schon ausgegeben. Aber ich rate mal, dass du wissen willst, wie du dich in der Struktur entlanghangelst.

    stdClass Object
    (
        [GetCountriesResult] => stdClass Object
            (
                [Country] => Array
                    (
                        [0] => stdClass Object
                            (
                                [id] => 8
                                [name] => Belgien
                                [iso1] => BE
                                [iso2] => BEL
                            )
    
                        [1] => stdClass Object
                            (
                                [id] => 24
                                [name] => Dänemark
                                [iso1] => DK
                                [iso2] => DNK
                            )
    
                    )
    
            )
    
    )
    

    Schrittweise. $result ist ein Objekt, wie man der ersten Zeile entnehmen kann. Auf Eigenschaften eines Objekts greift man mit -> zu, gefolgt vom Namen der Eigenschaft, also $result->GetCountriesResult. Genauso geht es mit Country weiter, weil $result->GetCountriesResult ebenfalls ein Objekt ist: $result->GetCountriesResult->Country. Das ist nun ein Array, über das du sicherlich mit foreach laufen möchtest

    foreach ($result->GetCountriesResult->Country as $country) {
      ...
    }
    

    Nun hast du in $country jeweils ein weiteres Objekt und auf dessen Eigenschaften greifst du wieder mit -> zu, also $country->id und so weiter.

    dedlfix.

    1. Hallo dedlfix,

      vielen Dank für deine sehr gute Erklärung. Ich habe meinen Code nun angepasst und es funktioniert:

      foreach ($result->GetCountriesResult->Country as $country)
      {
      	echo "[".$country->id."] - " . $country->name;
      	echo "<br>";
      }
      

      Noch eine Frage zu print_r($result);

      Wenn ich mir die Ausgabe im Browser anschaue steht alles hintereinander. Wenn ich mir den Quelltext anschaue habe ich eine schöne Auflistung wie in meinem ersten Posting. Woran liegt dieses?

      1. Tach!

        Wenn ich mir die Ausgabe im Browser anschaue steht alles hintereinander. Wenn ich mir den Quelltext anschaue habe ich eine schöne Auflistung wie in meinem ersten Posting. Woran liegt dieses?

        An der Whitespace-Behandlung der Browser. Alle Whitespace, darunter auch Tabs und Zeilenumbrüche, werden durch ein Leerzeichen ersetzt. Gegenmaßnahmen wären <pre> oder mit CSS white-space:pre;

        dedlfix.

      2. Hallo dedlfix,

        hab mein Code noch etwas überarbeitet. Jetzt werden meine Einträge nach ID sortiert. Vorher waren diese kreuz und quer sortiert.

        sort ($result->GetCountriesResult->Country);
        foreach ($result->GetCountriesResult->Country as $country)
        {
        	echo "[".$country->id."] - " . $country->name;
        	echo "<br>";
        }
        
        1. Tach!

          hab mein Code noch etwas überarbeitet. Jetzt werden meine Einträge nach ID sortiert. Vorher waren diese kreuz und quer sortiert.

          sort ($result->GetCountriesResult->Country);
          

          Das wird wohl mehr oder weniger Zufall sein. sort() muss in deinem Fall Objekte vergleichen. Ich wüsste nicht mal, dass irgendwie definiert wäre, wann ein Objekt größer oder kleiner als ein anderes ist. Dass sort() von sich aus eine Eigenschaft namens id heranzieht, ist jedenfalls nicht dokumentiert. Auch nicht, dass es die erste Eigenschaft nimmt, die es finden kann. Vielleicht versucht es, das Objekt in einen String zu wandeln. Der richtige Weg wäre, eine der u*sort-Funktionen zu verwenden und eine selbst verfasste Vergleichsfunktion anzugeben, die explizit die id-Felder (oder was auch immer) vergleicht.

          dedlfix.

        2. @@Klaus

          foreach ($result->GetCountriesResult->Country as $country)
          {
          	echo "[".$country->id."] - " . $country->name;
          	echo "<br>";
          }
          

          Ich halte es generell für keine gute Idee, Markup mit PHP auszugeben.

          Besser so:

          <?php foreach ($result->GetCountriesResult->Country as $country): ?>
            [<?php echo $country->id; ?>] - <?php echo $country->name; ?><br>
          <?php endforeach; ?>
          

          oder in kurz:

          <?php foreach ($result->GetCountriesResult->Country as $country): ?>
            [<?= $country->id ?>] - <?= $country->name ?><br>
          <?php endforeach; ?>
          

          Sagte ich kürzlich erst.

          Noch besser wäre natürlich, eine Liste als solche auszuzeichnen:

          <ul>
          <?php foreach ($result->GetCountriesResult->Country as $country): ?>
            <li>[<?= $country->id ?>] - <?= $country->name ?></li>
          <?php endforeach; ?>
          </ul>
          

          LLAP 🖖

          --
          „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
          „Hat auf dem Forum herumgelungert …“
          (Wachen in Asterix 36: Der Papyrus des Cäsar)
          1. Tach!

            foreach ($result->GetCountriesResult->Country as $country)
            {
            	echo "[".$country->id."] - " . $country->name;
            	echo "<br>";
            }
            

            Besser so:

            <?php foreach ($result->GetCountriesResult->Country as $country): ?>
              [<?php echo $country->id; ?>] - <?php echo $country->name; ?><br>
            <?php endforeach; ?>
            

            In jedem Fall, egal wie herum geschachtelt, htmlspecialchars() nicht vergessen!

            dedlfix.

            1. Hallo,

              In jedem Fall, egal wie herum geschachtelt, htmlspecialchars() nicht vergessen!

              auch bei Daten, die ich durch eine API abrufe? Ich dachte immer htmlspecialchars() kommt nur zum Einsatz, wenn User Daten eingeben. In diesem Fall hole ich mir Daten von Google also kann keiner dazwischenfunken und mir etwas unterjubeln?

              1. Hallo Klaus,

                In jedem Fall, egal wie herum geschachtelt, htmlspecialchars() nicht vergessen!

                auch bei Daten,

                bei allen Daten, die als Text in ein HTML-Dokument ausgegeben werden sollen.

                Bis demnächst
                Matthias

                --
                Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
              2. Tach!

                In jedem Fall, egal wie herum geschachtelt, htmlspecialchars() nicht vergessen!

                auch bei Daten, die ich durch eine API abrufe?

                Immer, wenn man Text in HTML einfügt (den man nicht selbst als Literal in den Code geschrieben hat und der nachweislich keine HTML-spezifischen Zeichen enthält).

                Ich dachte immer htmlspecialchars() kommt nur zum Einsatz, wenn User Daten eingeben.

                Es ist irrelevant, wo die Daten herkommen. Auch nicht von Usern eingegebener Text kann Zeichen enthalten, die für HTML maskiert werden müssen. Die Funktion heißt htmlspecialchars und nicht sanitizeUserInput. Ihre Aufgabe ist nicht, Nutzereingaben zu entschärfen, sondern Text HTML-gerecht aufzubereiten.

                In diesem Fall hole ich mir Daten von Google also kann keiner dazwischenfunken und mir etwas unterjubeln?

                Ist auch egal. Wenn Google kein HTML liefert sondern Text, ist das quasi Pflicht. Selbst dann, wenn nach Art der Daten keine HTML-spezifischen Zeichen enthalten sein können, sollte man hier nicht am falschen Ende sparen.

                dedlfix.

          2. Hi there,

            Ich halte es generell für keine gute Idee, Markup mit PHP auszugeben.

            Aha? Und warum? Die Alternative mit <? und ?> alle zwei, drei Zentimeter am Bildschirm ist viel schlechter les- und wartbar...

            1. @@Klawischnigg

              Die Alternative mit <? und ?> alle zwei, drei Zentimeter am Bildschirm ist viel schlechter les- und wartbar...

              Als was? Schlechter als der Wust von Anführungszeichen, innerhalb derer man andere Anführungszeichen (die im Markup ja durchaus vorkommen sollen) escapen muss? Schlechter als der Fliegenschiss, der in PHP als Stringkonkatenationsoperator dient? Ernsthaft? Nee, ne?

              LLAP 🖖

              --
              „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
              „Hat auf dem Forum herumgelungert …“
              (Wachen in Asterix 36: Der Papyrus des Cäsar)
              1. Aloha ;)

                Als was? Schlechter als der Wust von Anführungszeichen, innerhalb derer man andere Anführungszeichen (die im Markup ja durchaus vorkommen sollen) escapen muss? Schlechter als der Fliegenschiss, der in PHP als Stringkonkatenationsoperator dient? Ernsthaft? Nee, ne?

                Ersteres kommt in diesem Beispiel nicht vor. Zweiteres verbuche ich mal unter unsachlich. Und ja, dein in diesem Fall als "besser" gelobtes

                <?php foreach ($result->GetCountriesResult->Country as $country): ?>
                  [<?php echo $country->id; ?>] - <?php echo $country->name; ?><br>
                <?php endforeach; ?>
                

                ist deutlich schlechter lesbar als (Einfügung der <? ?> von mir):

                <?
                  foreach ($result->GetCountriesResult->Country as $country)
                  {
                  	  echo "[".$country->id."] - " . $country->name;
                  	  echo "<br>";
                  }
                ?>
                

                Die Kritik war hier mMn einfach deplatziert. In dem von dir verlinkten Fall war die Ausgangssituation anders und die Kritik sehr viel angebrachter/sinnvoller.

                Dieses Beispiel illustriert ganz klar, dass man einem Prinzip nicht immer blind, sondern besser situationsangepasst und mit Bedacht folgt.

                Grüße,

                RIDER

                --
                Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
              2. Hi there,

                @@Klawischnigg

                Die Alternative mit <? und ?> alle zwei, drei Zentimeter am Bildschirm ist viel schlechter les- und wartbar...

                Als was? Schlechter als der Wust von Anführungszeichen, innerhalb derer man andere Anführungszeichen (die im Markup ja durchaus vorkommen sollen) escapen muss?

                Das ist ein theoretisches Problem. Ich verwende in PHP prinzipiell nur einfache Anführungszeichen, da hab ich dann nicht nur bei Attributen im Markup kein Problem.

                Schlechter als der Fliegenschiss, der in PHP als Stringkonkatenationsoperator dient? Ernsthaft? Nee, ne?

                Hm? Warum sollte mich das beim Darstellen von Markup in PHP stören? Ich meine, soll jeder machen wie er es will, und was praktikabler ist hängt unter Umständen auch von der Qualität des verwendeten Editors (Syntaxhighlighting) ab, aber für eine Aussage wie:

                Ich halte es generell für keine gute Idee, Markup mit PHP auszugeben.

                ist Deine Argumentationslinie schon ziemlich dünn...

          3. Aloha ;)

            Ich halte es generell für keine gute Idee, Markup mit PHP auszugeben.

            Sag lieber: "in den meisten Fällen" statt "generell". Es ist gut und wichtig, darauf hinzuweisen, aber nicht jeder Anwendungsfall ist gleich und generelle Aussagen ohne Kenntnis und Berücksichtigung des konkreten Anwendungsfalls sind immer schwierig.

            Zwar kann "generell" je nach Betonung auch beinhalten, dass es auch Ausnahmen geben kann, das wird aber nicht so recht klar.

            Dass ich kein Fan vom Predigen extremer Prinzipien (oder eher: vom extremen Predigen von Prinzipien) bin, habe ich ja schon des Öfteren ausgedrückt und begründet.

            Insbesondere halte ich, wie auch Klawischnigg, gerade in diesem Fall die von dir vorgeschlagene Variante (die ohne <ul> und <li>, bei der mit sieht es ggf. anders aus) für unnötig umständlich, zumal sie genau dasselbe tut (also Markup mit PHP ausgeben). Das hier ist wahrlich kein Musterbeispiel dafür, dass das Einbetten von PHP in Markup besser ist als das Ausgeben von Markup durch PHP - im Gegensatz zu anderen Beispielen, wo das meist der Fall ist.

            Grüße,

            RIDER

            --
            Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
      3. Hallo,

        Noch eine Frage zu print_r($result);

        Wenn ich mir die Ausgabe im Browser anschaue steht alles hintereinander. Wenn ich mir den Quelltext anschaue habe ich eine schöne Auflistung wie in meinem ersten Posting. Woran liegt dieses?

        an der Interpretation von Zeilenumbrüchen im HTML-Quellcode. Zeilenumbrüche, Tabs und Leerzeichen werden alle nur als Whitespace interpretiert.

        Wenn du die Ausgabe von print_r() auch im Browser sauber formatiert sehen willst, kannst du ein pre-Element drumherum setzen.

        So long,
         Martin