2016-07-21 16 views
0

テーブルからCSVファイルにデータを送信する際に問題があります。CSVファイルへの特定の配列

Array 

[link1] => HTTP Code 
[link2] => HTTP Code 
[link3] => HTTP Code 
[link4] => HTTP Code 

リンクが再発しないようにデータをCSVファイルに送信する必要があります。 残念ながら、リンクの後にリンクを送信する方法(私はforeachループで働く)を知り、これらのリンクのそれぞれを抽出してCSVに送信すると同時に、すでに表示されていないチェックを行います。

これは私のコードです:

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 ... '; 

私は.xmlファイルからのすべてのリンクを取得し、同じページ上にあるダウンロードリンクとHTTPのステータスを指定する必要があります。私が行ったこの部分。私はCSVファイルにデータを送る適切な方法だけではありません。

私はあなたの助けを頼りにしています。

+0

fputscsvを使用する前に、 '$ wynik = array(array) 'から1つの配列()を削除してみてください。 '$ wynik = array()'が一度だけ返されます – JustOnUnderMillions

+0

fputcsv()foreachループをリンク処理ループの後、つまりその外側に置くことはできませんか? $ wynikはもちろん大きくなりますので、あなたにはメモリが用意されています。また、$ urlをキーとして、それを結合配列にします。そうすれば、各$ url値は1回だけ書き込まれます。 –

答えて

0

以下のコードは基本的にコードを変更したものです。 ://がPHPの配列キーの一部として受け入れられないように見えることもありました。

<?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

助けてくれてありがとう。私はその仕事でそれを練習しました。最初は新しい配列を作成し、ループの各ステップの結果を保存します。 –

関連する問題