2016-07-21 15 views
0

Ich habe ein Problem beim Senden von Daten aus einer Tabelle in eine CSV-Datei.Spezifisches Array in CSV-Datei

Ich muss die Daten an eine CSV-Datei senden, so dass die Verknüpfungen nicht erneut auftreten. Leider weiß ich nicht, wie man Link für Link (ich arbeite in einer foreach-Schleife), um jeden dieser Links zu extrahieren und senden Sie es an CSV, und zur gleichen Zeit überprüfen, dass bereits nicht angezeigt.

Dies ist mein Code:

require('simple/simple_html_dom.php'); 
$xml = simplexml_load_file('https://www.gutscheinpony.de/sitemap.xml'); 
$fp = fopen('Links2.csv', 'w'); 
set_time_limit(0); 

$links=[]; 

foreach ($xml->url as $link_url) 
{ 

    $url = $link_url->loc; 

    $data=file_get_html($url); 
    $data = strip_tags($data,"<a>"); 
    $d = preg_split("/<\/a>/",$data); 

    foreach ($d as $k=>$u){ 
     if(strpos($u, "<a href=") !== FALSE){ 
      $u = preg_replace("/.*<a\s+href=\"/sm","",$u); 
      $u = preg_replace("/\".*/","",$u); 

      if (strpos($u, "http") !== FALSE) { 
        $ch = curl_init($u); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        $output = curl_exec($ch); 
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

        if(strpos($u, "https://www.gutscheinpony.de/") !== FALSE) 
         $u = substr($u, 28); 

         if($u == "/") 
          $u = $url; 
         } 

      $links[$u] = $http_code; 

       $wynik = array(array($u, $url , $http_code)); 



      foreach ($wynik as $fields) { 
       fputcsv($fp, $fields); 
      } 
     } 
    } 
} 


    curl_close($ch); 
    fclose($fp); 

echo 'Send to CSV file successfully completed ... '; 

ich jeden Link von .xml erhalten müssen, Download-Links, die auf der gleichen Seite und den HTTP-Status angeben. Dieser Teil habe ich gemacht. Ich kann nicht nur einen geeigneten Weg finden, Daten an eine CSV-Datei zu senden.

Ich zähle auf Ihre Hilfe.

+0

Versuchen Sie, ein Array() aus '$ wynik = array (array())' zu entfernen, bevor Sie fputscsv verwenden. also nur einmal $ wynik = array() 'gegeben – JustOnUnderMillions

+0

Können Sie nicht einfach die fputcsv() foreach-Schleife nach der Link Processing Loop, d. $ wynik wird natürlich größer werden, also vorausgesetzt, Sie haben die Erinnerung dafür. Machen Sie es auch zu einem assoziativen Array mit $ url als Schlüssel. Auf diese Weise wird jeder $ url Wert nur einmal geschrieben. –

Antwort

0

Der folgende Code ist im Wesentlichen Ihr Code mit ein paar Änderungen. Es gab auch die Beobachtung, dass :// als Teil von PHP Array Keys nicht akzeptabel erscheint.

<?php 

     require __DIR__ . '/simple/simple_html_dom.php'; 
     $xml  = simplexml_load_file('https://www.gutscheinpony.de/sitemap.xml'); 
     $fp   = fopen(__DIR__ . '/Links2.csv', 'w'); 
     set_time_limit(0); 
     $links  = []; 
     $status  = false; 

     foreach ($xml->url as $link_url){ 

      $url = $link_url->loc; 
      $data = file_get_html($url); 
      $data = strip_tags($data,"<a>"); 
      $d  = preg_split("/<\/a>/",$data); 

      foreach ($d as $k=>$u){ 
       $http_code = 404; 
       if(strpos($u, "<a href=") !== FALSE){ 
        $u = preg_replace("/.*<a\s+href=\"/sm","",$u); 
        $u = preg_replace("/\".*/","",$u); 

        if (strpos($u, "http") !== FALSE) { 
         // JUST GET THE CODE ON EACH ITERATION, 
         // OPENING THE STREAM & CLOSING IT AGAIN ON EACH ITERATION... 
         $http_code = getHttpCodeStatus($u); 

         if(strpos($u, "https://www.gutscheinpony.de/") !== FALSE){ 
          $u = substr($u, 28); 
         } 

         if($u == "/") { 
          $u = $url; 
         } 
         // THIS COULD BE A BUG... USING :// AS PART OF AN ARRAY KEY SEEMS NOT TO WORK 
         $links[str_replace("://", "_", $u)] = $http_code; 

         // RUN THE var_dump(), TO VIEW THE PROCESS AS IT PROGRESSES IF YOU WISH TO 
         var_dump($links); 
         $status = fputcsv($fp, array($u, $url , $http_code)); 
        } 

       } 
      } 
     } 


     fclose($fp); 
     if($status) { 
      echo count($links) . ' entries were successfully processed and written to disk as a CSV File... '; 
     }else{ 
      echo 'It seems like some entries were not successfully written to disk - at least the last entry... ';     
     } 

     function getHttpCodeStatus($u){ 
      $ch   = curl_init($u); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
      $output  = curl_exec($ch); 
      $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
      curl_close($ch); 
      return $http_code; 
     } 
+0

Danke für Hilfe. Ich habe es mit der Aufgabe gemacht. Beim ersten erstelle ich ein neues Array und speichere die Ergebnisse jedes Schrittes der Schleife. –