pt004: Array befüllen und durchsuchen

Hallo, letztlich will ich, dass doppelt vorhandene Strings (Schlagzeilen) übergangen werden.

  
$myhtml = file_get_contents('http://www.webseite.html');  
  
$doc = new DOMDocument();  
$doc->loadHTML($myhtml);  
  
{$tags = $doc->getElementsByTagName('h2');}  
 $zaehler = 1;  
$tagalt = '';  
  
	foreach ($tags as $tag)  
  
 if (($zaehler <= 15) && ($tag->nodeValue !== $tagalt)) {  
  
  
       echo '<li><a href="http://www.zdf.de/ZDF/zdfportal/web/heute-Nachrichten/4672/6023530/eda928/Wirtschaft.html" target="_blank">' . $tag->nodeValue. '</a></li>';  
$zaehler++;  
$tagalt = $tag->nodeValue;  
  
  
}  
  
  

Bisher habe ich nur geschafft, dass doppelte Sätze, die unmittelbar hintereinander kommen ausgeschlossen werden, aber ich muss alle Sätze in ein array lesen und hinterher vergleichen, ob $tag->nodeValue darin enthalten ist. Meine bisherigen Versuche scheiterten. Hatte es z. B. so versucht:

$arr = array($tag->nodeValue);  
  
 if (($zaehler <= 15) && ($tag->nodeValue !== $arr)) {  
$arr[$zaehler] = $tag->nodeValue;  
  

Kenne mich mit arrays aber auch noch nicht so genau aus, obwohl ich mir die Seiten http://www.php-einfach.de/php-tutorial/php-array.php und http://tut.php-quake.net/de/array.html durchgelesen habe.
Hat jemand noch einen Tipp.

Gruß
pt004

  1. hi,

    vertausche key und value:

    $vorher[0] = "a";
    $vorher[1] = "a";

    $nachher["a"] = 1;

    ein key kann nur einmal vorkommen im assoiziativen array.

    mfg

    tami

    1. hi,

      hi,

      vertausche key und value:

      $vorher[0] = "a";
      $vorher[1] = "a";

      $nachher["a"] = 1;

      äh, ich vergaß "array_unique()", das musst du nehmen.

      mfg

      tami

      1. hi,

        hi,

        vertausche key und value:

        $vorher[0] = "a";
        $vorher[1] = "a";

        $nachher["a"] = 1;

        äh, ich vergaß "array_unique()", das musst du nehmen.

        mfg

        tami

        Tut mir leid, das mit der Vertauschung verstehe ich nicht. array_unique leuchtet mit ein, aber es funktioniert nicht. Habe es so versucht, aber ich glaube ich habe ein Grundsatzproblem: Wie fülle ich mit einer variablen ein array? $tags ist doch ein array

        $tags = $doc->getElementsByTagName('h2');  
          
        $result  = array_unique($tags);  
        	foreach ($result as $tag)  
         if ($zaehler <= 15) {  
          
          
               echo  '<li><a href="http://www.beispielseite.html" target="_blank">' . $tag->nodeValue. '</a></li>';  
        $zaehler++;  
        
        

        hast Du eine Idee, wo mein Fehler liegt?

        Gruß
        pt004

  2. Tach!

    letztlich will ich, dass doppelt vorhandene Strings (Schlagzeilen) übergangen werden.
    [DOMDocument]
    $tags = $doc->getElementsByTagName('h2');

    Du hast zunächst einmal noch keine Strings direkt vorliegen, sondern Objekte, bei denen in irgendeiner Eigenschaft der nämliche String steckt. Ein array_unique() müsste also Objekte miteinander vergleichen, was nur unter bestimmten Umständen zielführend ist. Namentlich muss der Rest der Eigenschaften ebenfalls gleich sein, nicht nur der zu vergleichende String. Das ist vermutlich nicht gegeben.

    Um das Ziel zu erreichen, kannst du einerseits alle Strings aus dem DOMNode in ein einfaches Array extrahieren, welches du dann durch array_unique() schicken kannst. Wenn du zusätzlich zu dem String jedoch noch weitere Werte aus dem Node benötigst, bringt dir das aber nicht viel. Andererseits kannst du auch vor dem Durchlaufen der Nodes ein leeres Array anlegen. Bei jedem Node prüfst du nun, ob der String schon im Array enthalten ist und wenn nicht, bearbeitest du den Node und fügst nur dessen String in das Array ein. Das Array kannst du nach der Schleife entsorgen, oder es PHP überlassen.

    dedlfix.

    1. Um das Ziel zu erreichen, kannst du einerseits alle Strings aus dem DOMNode in ein einfaches Array extrahieren, welches du dann durch array_unique() schicken kannst. Wenn du zusätzlich zu dem String jedoch noch weitere Werte aus dem Node benötigst, bringt dir das aber nicht viel. Andererseits kannst du auch vor dem Durchlaufen der Nodes ein leeres Array anlegen. Bei jedem Node prüfst du nun, ob der String schon im Array enthalten ist und wenn nicht, bearbeitest du den Node und fügst nur dessen String in das Array ein. Das Array kannst du nach der Schleife entsorgen, oder es PHP überlassen.

      dedlfix.

      Hallo, danke für die Antwort. Wenn wir noch mal das Beispiel nehmen:

      $myhtml = file_get_contents('http://www.webseite.html');  
        
      $doc = new DOMDocument();  
      $doc->loadHTML($myhtml);  
        
      {$tags = $doc->getElementsByTagName('h2');}  
       $zaehler = 1;  
      $tagalt = '';  
        
              foreach ($tags as $tag)  
        
      
      

      Ist dann $tags nicht schon ein array, das ich durch array_unique schicken könnte? Aber das habe ich versucht ohne dass ich etwas herausbekamm. Und wenn nicht: Wie befülle ich ein array bei jedem Durchlauf mit "$tag->nodeValue" und wie kann ich es dann durchsuchen - mit "in_array"?

      Gruß und Dank pt004

      1. Tach!

        {$tags = $doc->getElementsByTagName('h2');}
        Ist dann $tags nicht schon ein array, das ich durch array_unique schicken könnte?

        Das antwortete ich schon. Schau dir mit var_dump() an, was es ist (<pre> davor ausgeben), dann könntest du ein Array mit Objekten sehen. array_unique() könnte also nur komplette Objekte miteinander vergleichen. In Wirklichkeit ist $tags jedoch nicht mal ein Array sondern ein Objekt der Klasse DOMNodelist. Durch das kann man immerhin iterieren.

        Wie befülle ich ein array bei jedem Durchlauf mit "$tag->nodeValue"

        Das Hinzufügen einen neuen Arrayelements ist PHP-Grundlagenwissen. DU musst genau den gewünschten String, nicht mehr und nicht weniger hinzufügen. Kontrollier das bitte mit var_dump() - das was du hinzuzufügen gedenkst, als auch das Ergebnis (sprich: das Array).

        und wie kann ich es dann durchsuchen - mit "in_array"?

        Zitat aus dem PHP-Handbuch: "in_array — Checks if a value exists in an array" - klingt doch zielführend, oder?

        dedlfix.