foreach - Schleifen und arrays

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #61
    Geschafft

    habe erfolgreich meine "array-Experimente" vertieft und den <p>-tag erstmal in ein array gepackt und dann als title ausgegeben. war gar nicht so schwer.

    Gruß
    newbie1955

    Kommentar


    • #62
      Zitat von newbie1955 Beitrag anzeigen
      Zumal ich ohnehin nicht weiß wie man 2 Tags gleichzeitig abruft und in einer Schleife ausgibt?
      Da gibt es sicherlich unterschiedliche Möglichkeiten, dass Du die mit nextSibling holst oder so. Du wolltest doch ein Tutorial beginnen, in dem Du diese Varianten mit XPath alle erläuterst und da ist doch dann so etwas mit Sicherheit dabei. Oder wie weit bist Du mit diesem Vorhaben?

      So weit wie Du stecke ich da nicht in der Materie. Habe zwar etwas probiert, doch für mich geht so etwas bei so übersichtlichen Seiten immer noch am schnellsten, wenn ich da selber einen Ausdruck schreibe.

      PHP-Code:
      <?php

      $data 
      file_get_contents('http://www.ndr.de/info/nachrichten287.html');

      function 
      sucheInhalt($daten) {

          if (
      preg_match_all("/<h2>(.+?)<\/h2>.+?<p>(.+?)<\/p>/si"$daten$fund)){

              
      $inarr count($fund[1]);
              echo 
      "<ul>\n";

              for (
      $i 0$i $inarr$i++) {

                  echo 
      "<li><a href=\"http://www.ndr.de/info/nachrichten287.html\" target=\"_blank\">".htmlspecialchars($fund[1][$i], ENT_QUOTES)."</a><br>\n".
                       
      htmlspecialchars($fund[2][$i], ENT_QUOTES)."</li>\n";
              }
              echo 
      "</ul>\n";
          }
      }

      sucheInhalt($data);

      ?>
      Zitat von newbie1955 Beitrag anzeigen
      Studiere jetzt das Buch von Claudia Unkelbach, ich finde es gut, auch wenn es von Fehlern wimmelt.
      Das ist normal im Selbstverlag. Sehr viele Autoren können nicht fehlerfrei schreiben, dafür hat jeder Verlag einen Lektor. Nur im Selbstverlag kostet der extra und viele Autoren verzichten dann darauf. Lektoren wiederum fehlt zuweilen wohl das Zeug zum Autor, sonst würden sie ja Bücher schreiben und nicht nur die Manuskripte von anderen Autoren korrigieren.

      Zur Frage mal ganz allgemein. Habe heute schon an eine Zeichnung mit einem Baum gedacht. Eigentlich gibt es da schon einige, doch so in "PHP für Rentner" weiß ich jetzt nicht.

      Jedenfalls so, dass jeder Rentner das versteht, gleich ob HTML, XHTML oder XML, ob mit DOM oder XPath oder mit SimpleXML, wer nicht bis zum Herbst warten will, bis die Nüsse von alleine vom Baum fallen, muss sich zumindest eine Leiter an den Baum stellen, bis zum nächsten Ast klettern, sich den Zweig greifen, die erste und zweite Nuss pflücken und deren Schale entfern, bevor er an den Kern gelangt. Wenn er die Reihenfolge nicht einhält, fällt er vom Baum oder die Schale bleibt ihm im Hals stecken, in jedem Fall muss eine Error-Mitteilung an den Notdienst übermittelt werden. Also:

      Stamm->Ast->Zweig->Früchte->Frucht->Fruchtschale->Kern

      HTML-Code:
      <wurzel>
        <spezies>lateinischer Name</spezies>
        <subspezies>lateinischer Name</subspezies>
        <material>Biomasse Holz</material>
        <stamm>
          <ast>
            <zweig>
              <fruechte>
                <frucht="reif">
                  <fruchtschale>
                    <inhalt>Walnusskern</inhalt>
                  </fruchtschale>
                </frucht>
                <frucht="unreif">
                  <fruchtschale>
                    <inhalt>Walnusskern</inhalt>
                  </fruchtschale>
                </frucht>
              </fruechte>
            </zweig>
          </ast>
        </stamm>
      </wurzel>
      Anders sieht es aber bei Früchten aus, die in greifbarer Höhe reifen, da geht es dann zuweilen recht einfach ab und man kann sich gleich an den Früchten vergreifen, braucht nur noch die Schale zu entfernen.

      Früchte->Frucht->Fruchtschale->Kern

      HTML-Code:
      <wurzel>
        <spezies>lateinischer Name</spezies>
        <subspezies>lateinischer Name</subspezies>
        <material>Biomasse Holz</material>
        <fruechte>
          <frucht="reif">
            <fruchtschale>
              <inhalt>Walnusskern</inhalt>
            </fruchtschale>
          </frucht>
          <frucht="unreif">
            <fruchtschale>
              <inhalt>Walnusskern</inhalt>
            </fruchtschale>
          </frucht>
        </fruechte>
      </wurzel>
      XPath ist wie eine Stehleiter, die ein Rentner (Kids wäre ja unkorrekt) so aufstellen kann, dass er leichter an die Früchte gelangt. Doch wenn er nur den Zweig anvisiert und nicht die Frucht, muss er den restlich Weg bis zum Kern dennoch einhalten.

      Und wenn Du es auf diese Art und Weise nicht verstehst, dann kapituliere ich.
      Zuletzt geändert von Melewo; 14.06.2013, 18:42.

      Kommentar


      • #63
        Also

        an die Zusage für ein Tutorial kann ich mich nicht erinnern. Das würde wohl noch ein paar Jahre dauern.

        Welche allgemeine Frage meinst Du? Also ich glaube, diese Baumstruktur habe ich schon verstanden - auch wenn ich manchmal beim Durchlesen eines Quelltextes nicht so richtig sehe, wo ein node endet und der nächste anfängt, vor allem, wenn nicht richtig geschlossen wird. Ich komme ja auch inzwischen an alle Werte ran, Naja, wer viel dumme Fragen fragt, muss sich dann ja auch den Spott über Rentner-PHPler anhören...(ich will mir ja nix beweisen - und im Alter wird man angeblich wieder wie ein Kid)

        Aber mal was anderes, hast Du eine Ahnung, warum der heute-feed nicht mit Deinem feedreader nicht funktioniert? Ist doch rss 2.0?

        <![CDATA[ZDFheute | Nachrichten - Startseite]]>

        Also beim Betrachten des Quelltextes fällt mir nix Störendes auf.
        Gruß newbie1955

        P.S. ich glaube gern, dass Kleinverlage sich keine Lektoren leisten können, ich frage mich nur, ob die Autorin dankbar ist für Hinweise auf Druck- und sonstige Fehler (für die nächste Auflage) oder nicht.

        Das mit dem NDR habe ich so gemacht:
        PHP-Code:
        $data file_get_contents('http://www.ndr.de/info/nachrichten287.html');  
        $doc = new DOMDocument(); 
        $doc->loadHTML($data); 
        $zaehler 0;


        $descs $doc->getElementsByTagName("p"); 

        foreach (
        $descs as $node2)
        {
        if ((
        $zaehler <= 10)&& ($node2->nodeValue !== '') && ($node2->nodeValue !== NULL)){

        $array[$zaehler] = $node2->nodeValue;
        $zaehler++;


        }
        }
        $result $doc->getElementsByTagName("h2"); 

        $zaehler 0;

        foreach (
        $result as $node
        {

        if ((
        $zaehler <= 10)&& ($node->nodeValue !== '') && ($node->nodeValue !== NULL)){

                 echo 
        '<li><a href="http://www.ndr.de/info/nachrichten287.html" target="_blank"  title ="' $array[$zaehler].'" >'
                           
        $node->nodeValue '</a></li>';
        $zaehler++;

        }
        }
        ?> 
        Zuletzt geändert von newbie1955; 14.06.2013, 19:04.

        Kommentar


        • #64
          Mal abgesehen davon, dass der Feed invalide ist, was Du ja mit

          W3C Feed Validation Service, for Atom and RSS

          überprüfen kannst, sehe ich einen möglichen Grund darin, dass im ersten Item nichts enthalten ist. Möglich, dass das Script sich daran verschluckt und dann die restlichen nicht mehr ausgibt.

          HTML-Code:
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <rss version="2.0">
          <channel>
              <title><![CDATA[...]]></title>
              <link>http://www....</link>
              <description/>
              <language>Deutsch</language>
              <copyright>copyright</copyright>
              <webMaster>webmaster</webMaster>
              <ttl>300000</ttl>
              <item>
                <title/>
                <description/>
              </item>
          Doch wie bereits geschrieben, es wäre unangebracht hier jeden verkorksten Feed beurteilen zu wollen.

          Das andere muss ich erst suchen.

          Kommentar


          • #65
            Habe ich doch auch überprüft

            ganz blöd bin ich ja auch nicht. Bei meinem feedcheck kam ein well-formed heraus. (siehe screenshot unten)
            Angehängte Dateien

            Kommentar


            • #66
              Zitat von newbie1955 Beitrag anzeigen
              Bei meinem feedcheck kam ein well-formed heraus.
              Hast Du den für Feeds benutzt?
              Bei mir war alles gelb, habe es angehängt.

              Kann eigentlich nur daran liegen, dass der mit einem leeren Item beginnt. Einiges an Fehlern schluckt und verarbeitet der ja nun schon, doch halt nicht alle Fehler, die andere noch schlucken würden. Hier mal eine Ausgabe mit print_r().

              PHP-Code:
              [item] => Array
                  (
                      [
              0] => SimpleXMLElement Object
                          
              (
                              [
              title] => SimpleXMLElement Object
                                  
              (
                                  )

                              [
              description] => SimpleXMLElement Object
                                  
              (
                                  )
                          )

                      [
              1] => SimpleXMLElement Object
                          
              (
                              [
              title] => A...
                              [
              description] => S...
                              [
              link] => http: ...
                          )

                      [
              2] => SimpleXMLElement Object
                          
              (
                              [
              title] => A...
                              [
              description] => L...
                              [
              link] => http: ...
                          ) 
              Wenn ich den leeren Abschnitt <item><title/><description/></item> entferne, dann ladet der Feed normal.

              PHP-Code:
              [item] => Array
                  (
                      [
              0] => SimpleXMLElement Object
                          
              (
                              [
              title] => A...
                              [
              description] => S...
                              [
              link] => http: ...
                          )

                      [
              1] => SimpleXMLElement Object
                          
              (
                              [
              title] => A...
                              [
              description] => L...
                              [
              link] => http: ...
                          )

                      [
              2] => SimpleXMLElement Object
                          
              (
                              [
              title] => S...
                              [
              description] => 1....
                              [
              link] => http: ...
                          ) 
              Angehängte Dateien
              Zuletzt geändert von Melewo; 14.06.2013, 20:40.

              Kommentar


              • #67
                Dann

                müsste ich wohl versuchen, den ersten item zu überspringen?

                Außerdem versuche ich gerade, aus manchen Descriptions/Summarys usw. noch die überflüssigen Zeichen rauszubekommen. Die Süddeutsche hat zum Beispiel immer zum Schluss ein &nbsp &nbsp &nbsp dran, das ich mit trim und str_replace auch nicht wegbekomme.

                PHP-Code:
                $desc = ($nachricht->description);
                $desc trim($desc);
                str_replace("&nbsp"""$desc); 
                Habe dann noch diverse Sachen durchprobiert, die bei stackoverflow empfohlen werden (try this....), aber da kam nix vernünftiges bei raus.
                Vielleicht werde ich einfach bei jeder Description nach zwei Sätzen Schluss machen, mehr muss da ja sowieso nicht ausgegeben werden. Zumal sowieso bei manchen noch zusätzliche Teasing-Infos ausgegeben werde, die ich nicht brauche (Mehr dazu....)...

                Zuz Validität, da muss ich wohl auf HTML geprüft haben...
                Zuletzt geändert von newbie1955; 14.06.2013, 21:57.

                Kommentar


                • #68
                  Zitat von newbie1955 Beitrag anzeigen
                  müsste ich wohl versuchen, den ersten item zu überspringen?
                  Hast Du richtig erfasst, da knobele ich die ganze Zeit schon herum und mir fällt nichts Vernünftiges ein. Im if-Statement wird nur das (oder der?) erste item überprüft, also item[0] und wenn leer und somit false, fängt die foreach-Schleife nicht an die restlichen zu durchlaufen.

                  PHP-Code:
                          if ($lesen != false) {

                              foreach (
                  $lesen as $nachricht) { 
                  Wenn ich nach den ersten beiden mit and frage, geht es auch nicht, da ja dann beide nicht false sein dürfen.

                  PHP-Code:
                  if ($lesen[0] != false and $lesen[1] != false) { 
                  Und mit or fällt mir gleich gar nichts ein. Das ist ja jetzt etwas zum Knobeln für Dich, falls mir nichts einfällt. Du könntest sicherlich einfach eine [1] hinter setzen, doch dann würde der wieder nichts liefern, falls morgen beim nächsten Feed das zweite item leer ist.

                  PHP-Code:
                          if ($lesen[1] != false) {

                              foreach (
                  $lesen as $nachricht) { 

                  Kommentar


                  • #69
                    Habe

                    jetzt erstmal $lesen[1] geprüft und dann geht es, aber da sind noch mehr vermurkste items drin, deshalb bricht er dann nach dem 8. ab. werde mal noch ein wenig rumprobieren.

                    Eine Idee zum &nbsp-Eliminieren?

                    Gruß
                    newebie1955

                    Kommentar


                    • #70
                      Zitat von newbie1955 Beitrag anzeigen
                      aber da sind noch mehr vermurkste items drin, deshalb bricht er dann nach dem 8. ab.
                      Ändere mal von:

                      PHP-Code:
                      if ($lesen != false) { 
                      in:

                      PHP-Code:
                      if (strlen($lesen[0]->title) > or strlen($lesen[1]->title) > 0) { 
                      Dann wird halt ersatzweise statt auf false auf Anzahl von Zeichen in den ersten beiden Titeln kontrolliert, also ob wenigsten einer der ersten beiden Titel mehr als 0 Zeichen enthält. Der bricht nicht bei den anderen leeren Item ab, der macht bei den nächsten Items weiter, was Du aber nur siehst, wenn Du die Anzahl mal von $maxim = 12 auf $maxim = 14 oder mehr erhöhst.

                      Wollte mich nie so lange mit dem Script beschäftigen, irgendwie müsste ich mich auch noch um ein paar andere Dinge kümmern. Fehlerkontrolle ist ja gut, umso ausgereifter wird das Script ja. Nur ich wüsste nicht was ich mit dem Ding anfangen könnte, außer so wie das alte Script zum Download anzubieten. Und einige wichtigere Dinge hätte ich schon noch zu tun. Doch wenn ich dann weiß, dieses oder jenes könnte noch verbessert werden, dann lässt mich das zuweilen auch keine Ruhe.
                      Dabei liegen die Fehler ja eigentlich nicht am Script, sondern an den fehlerhaften Feeds. Letztendlich ist es so wie mit den Browsern, die versuchen auch jede HTML-Seite mit X oder mehr Fehlern noch vernünftig darzustellen.

                      Kommentar


                      • #71
                        Danke

                        für Deine Mühe. Ich hatte auch etwas versucht mit "continue" und Zaehler hochsetzen, damit er bei fehlendem Inhalt einfach den nächsten item probiert, leider hat das nicht geklappt (leider ohne dass ich kapiert hätte, wieso.)

                        So wie Du es jetzt geschrieben hat, funktioniert das erstmal, muss nur sehen, dass ich in der Regel nur 10 feeds bekomme, evtl. könnte ich ja die Zahl der gewünschten feeds ebenso aus der Seite an die Feedfunktion.php übergeben wie ich die url übergebe.

                        Eigentlich muss es doch aber möglich sein, ihm zu sagen: "wenn da nix drin ist, überspring ihn halt und zähle ihn nicht mit."

                        Will Dich nicht von der Arbeit abhalten, antworte halt, wenn Du Zeit hast. Ich muss da sowieso noch ewig dran rumfummeln wg. der &nbsp und sonstiger description-Feingestaltung.
                        Gruß
                        newbie
                        Zuletzt geändert von newbie1955; 15.06.2013, 10:24.

                        Kommentar


                        • #72
                          Zitat von newbie1955 Beitrag anzeigen
                          Eigentlich muss es doch aber möglich sein, ihm zu sagen: "wenn da nix drin ist, überspring ihn halt und zähle ihn nicht mit."
                          Ja sicher, nur mir fliegt das auch nicht zu. Ergänzung, noch Nachricht darf nicht false sein, dann wird das unten folgende und völlig leere item übersprungen und dieses item, welches nur einen Link enthält, so angezeigt wie im IE und FF. Eine zusätzliche schließende Klammer an entsprechender Stelle nicht vergessen, also vor der schließenden Klammer der foreach.

                          PHP-Code:
                                  if (strlen($lesen[0]->title) > or strlen($lesen[1]->title) > 0) {

                                      foreach (
                          $lesen as $nachricht) {
                                      
                                          if (
                          $nachricht != false) { 
                          Nur warum das jetzt bei der Klasse nicht so funktioniert, habe ich noch nicht herausgefunden, da verstehe ich gerade etwas nicht.

                          Edit: Du kannst stattdessen aber auch bestimmen, dass zum Beispiel alle item übersprungen werden, die keinen Titel enthalten.

                          PHP-Code:
                          if (strlen($lesen[0]->title) > or strlen($lesen[1]->title) > 0) {

                              foreach (
                          $lesen as $nachricht) {
                              
                                  if (
                          $nachricht->title != false) { 
                          Ist eigentlich mit das Einfachste, Fragen und Bedingungen zu bestimmen, wann das Script was machen soll. Nur ab und an fallen mir die passenden Fragen für die Bedingungen nicht gleich ein, wie bei der ersten Zeile. Hatte auch nicht gleich begriffen, wieso sich diese leeren item

                          PHP-Code:
                          SimpleXMLElement Object
                          (
                              [
                          title] => SimpleXMLElement Object
                                  
                          (
                                  )

                              [
                          description] => SimpleXMLElement Object
                                  
                          (
                                  )

                          außerhalb einer Klasse mit

                          PHP-Code:
                          if ($nachricht != false) { 
                          abfangen lassen, innerhalb einer Klasse hingegen nur mit einem Statement wie diesem

                          PHP-Code:
                          if ($nachricht->title != false) { 
                          nicht aber mit:

                          PHP-Code:
                          if ($nachricht != false) { 
                          Könnte wohl daran liegen, dass $nachricht nicht wirklich leer ist, sondern noch zwei leere Objekte enthält. var_dump((bool) ...) scheint überall true zu liefern, egal wo, ob innerhalb oder außerhalb einer Klasse, ob mit oder oder ->title. Zumindest scheint es ja zuverlässig zu funktionieren.
                          Zuletzt geändert von Melewo; 15.06.2013, 15:40.

                          Kommentar


                          • #73
                            Also,

                            ich glaube mit Klassen muss ich mich noch mal beschäftigen, werde mal hier
                            PHP Class Tutorial - PHP Klassen erklärt ein wenig studieren, denn sonst kapiere ich den Unterschied zwischen "in" und "außerhalb" der Klasse auch nicht so recht.

                            Jetzt hake ich noch am &nbsp-Problem rum.

                            Gruß
                            newbie1955

                            Kommentar


                            • #74
                              Zitat von newbie1955 Beitrag anzeigen
                              ich glaube mit Klassen muss ich mich noch mal beschäftigen
                              3 x Hallo Welt

                              Du bist hier:

                              PHP-Code:
                              <?php
                              $variable 
                              " Welt<br>\n";

                              echo 
                              "Hallo".$variable;
                              ?>
                              Das solltest Du lernen, bis Du es richtig kannst:

                              PHP-Code:
                              <?php
                              function meineBegruessung($uebergabe) {

                                 return 
                              $uebergabe." Welt<br>\n";
                              }

                              echo 
                              meineBegruessung("Hallo");
                              ?>
                              Und bevor das letzte nicht richtig sitzt, würde ich an Deiner Stelle damit nicht beginnen, falls Dir bis dahin nicht die Lust vergangen sein sollte:

                              PHP-Code:

                              <?php

                              class HalloKlasse {

                                  public  
                              $eigenschaft1;
                                  private 
                              $eigenschaft2 "Welt";
                                  
                                  public function 
                              meineBegruessung() {

                                     return 
                              $this->eigenschaft1." ".$this->eigenschaft2."<br>\n";
                                  }        
                              }

                              $erstelle = new HalloKlasse();
                              $erstelle->eigenschaft1 "Hallo";

                              echo 
                              $erstelle->meineBegruessung();

                              ?>
                              Heraus kommt ohnehin nur:

                              Hallo Welt
                              Hallo Welt
                              Hallo Welt

                              Kommentar


                              • #75
                                Ja,

                                Danke für die "Unterrichtsstunde". Werde mir das genau anschauen, functions habe ich ja schon eingesetzt, aber beispielweise weiß ich noch nicht, ob ich auch mehrere Variable übergeben kann usw.

                                Gruß
                                newbie1955

                                Kommentar

                                Lädt...
                                X