配列出力をカンマ区切りに変換(PHP)

このQ&Aのポイント
  • 配列出力をカンマ区切りに変換する方法についてご教授ください。
  • DOMを使用してテーブルのスクレイピングを行い、結果をカンマ区切りで抽出したいです。
  • 結果をCSVファイルに出力するために、出力形式を調整したいです。
回答を見る
  • ベストアンサー

配列出力をカンマ区切りに変換(PHP)

DOMを使ってテーブルのスクレイピングをしたいと考えています。 【sample.html】 <table id="rates"> <tr> <th>施設名</th> <th>所在地</th> </tr><tr> <td>大谷地</td> <td>東3丁目3-20</td> </tr><tr> <td>札幌</td> <td>東1丁目1-20</td> </tr></table> 【scre.php】 <?php $entries = []; $dom = new DOMDocument; @$dom->loadHTMLFile('sample.html'); $xpath = new DOMXpath($dom); foreach ($xpath->query('//tr') as $i => $node) { if (!$i) { continue; } $entries[] = [ $xpath->evaluate('string(td[0])', $node), $xpath->evaluate('string(td[1])', $node), ]; } echo "<pre>"; print_r($entries); echo "</pre>"; ?> *************** 結果(出力値) *************** Array ( [0] => Array ( [0] => 大谷地 [1] => 東3丁目3-20 ) [1] => Array ( [0] => 札幌 [1] => 東1丁目1-20 ) 【やりたいこと】 この結果をカンマ区切りとして抽出したいと考えています。 ***************** 希望結果(希望出力値) ***************** 大谷地,東3丁目3-20 札幌,東1丁目1-20 また、このテーブルは別途CSVファイルに落とす予定のため、 echo $data; という形で出力可能なようにしたいと考えています。 初心者的質問で大変恐縮ですが、どうすればいいかご教授いただけましたら幸いです。 よろしくお願いいたします。

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

>別途CSVファイルに落とす予定 CSVファイルにするならfputcsvを使うべきです。(echoの引数のように)文字列として得るだけであっても(すでに回答がありますが)テンポラリファイルにfputcsvで書き出してそれをfile_get_contentsした方が確実です。 データの中にカンマがあったらどうするとか自分でやるのは面倒でしょ?

tajix14
質問者

お礼

ありがとうございます。 fputcsvで出来ました。 助かりました。

その他の回答 (2)

回答No.2

こんにちは そこまで出来てるなら、 $data = implode(',', $entries) でカンマ区切り文字列になりますよ。

tajix14
質問者

お礼

ありがとうございます。 出来ました。 助かりました。

回答No.1

すでに配列にするところまでできているなら、php://temp (http://php.net/manual/ja/wrappers.php.php) に putcsv (http://php.net/manual/ja/function.fputcsv.php)で書くとか?

tajix14
質問者

お礼

ありがとうございます。 fputcsvで出来ました。 助かりました。

関連するQ&A

  • スクレイピングPHPにおける複数spanについて

    外部のホームページのソースを拾いRSS化するPHPを作成しました。 ***************************************** 外部ホームページ http://hoge.com/index.html ***************************************** <html> <table class="Table100"> <tr> <th class="Name"><h1>えんどう豆</h1></th> <td class="Price">254</td> <td class="maker"> <span class="a1">メーカー</span> <span class="a2">遠藤農園</span> </td> </tr> </table> </html> ***************************************** スクレイピングPHP http://hagedebu.jp/index.php  ***************************************** <?php class SimpleXMLExtended extends SimpleXMLElement { public function addCData($data) { $dom = dom_import_simplexml($this); $dom->appendChild($dom->ownerDocument->createCDATASection($data)); } } $xml = new SimpleXMLExtended('<rss version="2.0"></rss>'); $channel = $xml->addChild('channel'); $channel->addChild('title', 'TEST RSS'); $dom = new DOMDocument; @$dom->loadHTMLFile('http://hoge.com/index.html'); $xpath = new DOMXPath($dom); foreach ($xpath->query('//*[@class="Table100"]') as $node) { $item = $channel->addChild('item'); $item->addChild('description')->addCData(implode('<br>', [ $xpath->evaluate('string(.//*[@class="Name"]/h1)', $node), $xpath->evaluate('string(.//*[@class="Price"])', $node), $xpath->evaluate('string(.//*[@class="maker"]/span)', $node), ])); } header('Content-Type: application/xml; charset=utf-8'); $xml->asXML('php://output'); ************************************************ 問題点 このPHPでは、 えんどう豆 254 メーカー と表示されてしまいます。 <td class="maker"> <span class="a1">メーカー</span> <span class="a2">遠藤農園</span> </td> class="makerに複数のspanが入っているため、2つめのspanを認識しません。 当方が表示させたいのは下記のようにspanを両方とも表示させたいです。 またはひとつしか表示させることができない場合は、「メーカー」ではなく「遠藤農園」を優先表示させたいです。 このように表示させるためにはどうすればよいでしょうか? 希望表示 えんどう豆 254 メーカー 遠藤農園 または えんどう豆 254 遠藤農園 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 連想配列から<th>を含むテーブルを作成する関数

    連想配列からテーブル(<th>テーブルヘッダ項目を含む)を作成する関数を作ろうと思っています。 配列と関数をどのように書けばHTMLのソースのようになるでしょうか? 値によって、<td>と<th>を振り分けるようになど良い方法を教えてください。 (1.できれば配列で<td> </td>は省略したいと思います。) (2.<th> </th>の指定場所は下のhtmlのように縦とか横とかにに変えられた方が良いです。) //----- 関数 ----- function table($v) { } //----- 配列 ----- $s = array(); $s[0] = array( 'A-1' , 'B-1' , 'C-1' , 'D-1' , 'E-1' ); $s[1] = array( 'A-2' , 'B-2' , 'C-2' , 'D-2' , 'E-2' ); $s[2] = array( 'A-3' , 'B-3' , 'C-3' , 'D-3' , 'E-3' ); $s[3] = array( 'A-4' , 'B-4' , 'C-4' , 'D-4' , 'E-4' ); $s[4] = array( 'A-5' , 'B-5' , 'C-5' , 'D-5' , 'E-5' ); table($s); //----- 生成されるhtml ----- <table> <tr><th>A-1</th><th>B-1</th><th>C-1</th><th>D-1</th><th>E-1</th></tr> <tr><td>A-2</td><td>B-2</td><td>C-2</td><td>D-2</td><td>E-2</td></tr> <tr><td>A-3</td><td>B-3</td><td>C-3</td><td>D-3</td><td>E-3</td></tr> <tr><td>A-4</td><td>B-4</td><td>C-4</td><td>D-4</td><td>E-4</td></tr> <tr><td>A-5</td><td>B-5</td><td>C-5</td><td>D-5</td><td>E-5</td></tr> </table> <table> <tr><th>A-1</th><td>B-1</td><td>C-1</td><td>D-1</td><td>E-1</td></tr> <tr><th>A-2</th><td>B-2</td><td>C-2</td><td>D-2</td><td>E-2</td></tr> <tr><th>A-3</th><td>B-3</td><td>C-3</td><td>D-3</td><td>E-3</td></tr> <tr><th>A-4</th><td>B-4</td><td>C-4</td><td>D-4</td><td>E-4</td></tr> <tr><th>A-5</th><td>B-5</td><td>C-5</td><td>D-5</td><td>E-5</td></tr> </table> //----- 考え中??の配列 ----- $s = array(); $s[0] = array( '<th>A-1</th>' , '<th>B-1</th>' , '<th>C-1</th>' , '<th>D-1</th>' , '<th>E-1</th>' ); $s[1] = array( 'A-2' , 'B-2' , 'C-2' , 'D-2' , 'E-2' ); $s[2] = array( 'A-3' , 'B-3' , 'C-3' , 'D-3' , 'E-3' ); $s[3] = array( 'A-4' , 'B-4' , 'C-4' , 'D-4' , 'E-4' ); $s[4] = array( 'A-5' , 'B-5' , 'C-5' , 'D-5' , 'E-5' ); table($s); $s = array(); $s[0] = array( 'th' => 'A-1' , 'B-1' , 'C-1' , 'D-1' , 'E-1' ); $s[1] = array( 'th' => 'A-2' , 'B-2' , 'C-2' , 'D-2' , 'E-2' ); $s[2] = array( 'th' => 'A-3' , 'B-3' , 'C-3' , 'D-3' , 'E-3' ); $s[3] = array( 'th' => 'A-4' , 'B-4' , 'C-4' , 'D-4' , 'E-4' ); $s[4] = array( 'th' => 'A-5' , 'B-5' , 'C-5' , 'D-5' , 'E-5' ); table($s); //----- 参考中のソース ----- //-- http://okwave.jp/qa/q8107250.html function table($v) { echo '<table>'; foreach ($v as $t1) { echo '<tr>'; foreach ($t1 as $t2) { echo '<td>' . $t2 . '</td>'; } echo '</tr>'; } echo '</table>'; }

    • ベストアンサー
    • PHP
  • php 連想配列テーブル

    <table border="1"> <tr><th>英語表記</th><th>日本語表記</th><th>和名</th><th>全長</th> <th>一番レアな素材</th></tr> <?php $array = array( "Lao Shan Lung" => "ラオシャンロン","巨龍","100m","老山龍の大爪", "Rathalos" => "リオレウス","火竜","40m","火竜の天鱗", "Rathian" => "リオレイヤ","雌火竜","35m","雌火竜の天鱗", "Tigrex" => "ティガレックス","轟竜","48m","轟竜の頭殻", "Rajang" => "ラージャン","金獅子","25m","黄金の毛", "Plesioth" => "ガノトトス","水竜","55m","エビの小殻", "Diablos" => "ディアブロス","角竜","45m","角竜の背甲", ); foreach ($array as $i) { echo "<tr><td>$i</td></tr>"; } ?> </table> これだと縦に表示されてしまいますちゃんと表示させるにはどうしたらいいでしょうか?

    • ベストアンサー
    • PHP
  • 検索結果を出すためには?(phpとmysql利用で)

    ある画像を押したら、検索結果が出る方法がわかりません。 たとえば、「A」「B」「C」の画像を作成しておき、「A」の画像を押したときにMYSQLで作成したデータベースの中から「A」だけ出す方法がわかりません。(画像からリンクする方法はわかります) 「A」という画像を押すと「akekka.php」を出すように作成したのですが、できません。知恵を貸してください。 <?php $sql= "select * from jyusyo where fuk = '愛媛県'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>\n"; exit; } else { echo "<table border=\"1\">\n"; echo "<tr>\n"; echo "<th>詳細</th>\n"; echo "<th>登録日<br></th>\n"; echo "<th>府県名<br></th>\n"; echo "<th>住所<br></th>\n"; echo "<th>名前</th>\n"; echo "</tr>\n"; while($row = mysql_fetch_array($result)){ $id = $row["id"]; echo "<tr>"; echo "<a href=\"meisai.php?id=$id\">",$id,"</a>\n"; echo "</td><td>"; echo $row["sho"]; echo "</td><td>"; echo $row["day"]; echo "</td><td>"; echo $row["fuk"]; echo "</td><td>"; echo $row["jyu"]; echo "</td><td>"; echo $row["nam"]; echo "</td></tr>"; } echo "</table>\n"; } ?>

  • PHPとHTMLをまとめてコメントアウトしたいので

    HTMLの中にPHPが混じっているコードを、上から下まで一気にコメントアウトしたいのですが、どうしたらいいでしょうか? PHPとHTMLに分け、それぞれコメントアウトしていくしかないのでしょうか? それだともの凄く見難くなるのですが…… 後、HTML複数行コメントアウトの中に、PHPコメントアウトを書いてもいいのでしょうか? 例) ----------------------------------------------------- ・今日の天気予報<br> ・一覧 … <?php echo array_sum($hoge); ?> 全国<br>  <table>  <tr id="Theading" >  <th id="Theading"> Yahoo</th>  <th id="Theading"> livedoor</th>  <th id="Theading"> excite</th>  </tr>  <?php foreach($hoge as $k => $v){ ?>  <tr id="Tvalues">  <td><?php echo $piyo; ?></td>  <td><?php echo $k; ?></td>  <td><?php echo $v; ?></td>  <?php $piyo++; ?>  </tr>  <?php } ?>  </table> <br><br> -----------------------------------------------------

    • ベストアンサー
    • PHP
  • No.を降順で表示するには

    // データファイルから1行ずつ配列として読み込み $data_all = file("../../db/csv/maillog.csv"); // データをHTML表示用に処理 for($i = 1 ; $i < count($data_all) ; $i++){ // 変数の開放 unset($a); // データを以下の配列として取得 // $data_array[0] - 求人NO // $data_array[1] - 公開日 // $data_array[2] - 求人の概要 // $data_array[3] - 業界 // $data_array[4] - 規模 // $data_array[5] - 上場区分 // $data_array[6] - 募集職種 $data_array = explode(",",$data_all[$i]); // データ表示フラグが成立している場合のHTML表示処理 echo "<TR>\n"; echo "<FORM method=\"post\" action=\"./mail.html\">\n"; echo "<TD nowrap><INPUT type=\"submit\" value=\" 詳細\"></TD>\n"; echo "<TD nowrap>" . $data_array[0] . "</TD>\n"; echo "<TD nowrap>" . $data_array[1] . "</TD>\n"; echo "<TD nowrap>" . $data_array[2] . "</TD>\n"; echo "<TD nowrap>" . $data_array[3] . "</TD>\n"; echo "<TD nowrap>" . $data_array[4] . "</TD>\n"; echo "<TD nowrap>" . $data_array[5] . "</TD>\n"; echo "<TD nowrap>" . $data_array[6] . "</TD>\n"; echo "<TD nowrap><INPUT type=\"submit\" value=\" 詳細\"></TD>\n"; echo "</FORM>\n"; echo "</TR>\n"; //データ表示件数を1加算 $data_view++; } ?> <TR> <TH nowrap>詳細</TH> <TH nowrap>No.</TH> <TH nowrap>公開日</TH> <TH nowrap>求人の概要</TH> <TH nowrap>業界</TH> <TH nowrap>規模</TH> <TH nowrap>上場区分</TH> <TH nowrap>募集職種</TH> </TR> </TABLE> 現状、表示するとNo.が昇順で表示されます。 このNo.を降順で表示させるにはどうすれば良いでしょうか? 教えてください。

    • 締切済み
    • PHP
  • PHPの問題を解いているのですが…

    昨日からずーと悩んでいるのですがfor文で *実際はテーブルを使ってます 値1 44 値2 55 値3 66 値4 77 件数 4件 平均 60.5 と出したいのですが下のプログラムでは出ませんなぜでしょうか? <HTML> <HEAD> <TITLE>for文例問題1</TITLE> </HEAD> <BODY> <table border> <?php $ary1 = array(44,55,66,77); for($i=0;$i<4;$i++) { $a = 44+55+66+77/4; <tr><th>値 $i</th>    <td>44</td></tr> <tr><th>値 $i</th>    <td>55</td></tr> <tr><th>値 $i</th>    <td>66</td></tr> <tr><th>値 $i</th>    <td>77</td></tr> <tr><th>件名</th> <td> $i件</td></tr> <tr><th>平均</th> <td> $a件</td></tr> </table> } ?> </BODY> </HTML> ご存知の方どうか助言お願いします

    • ベストアンサー
    • PHP
  • 自動で増えてくれるPHP

    以前に質問させて頂いた内容をもとに、以下のようなものを作成しました。 以前の質問 → http://okwave.jp/qa/q6858703.html 作成したもの ↓ 【Aサーバ】「a.txt」(データ用) $name01='一子'; $age01='11'; $name02='二郎'; $age02='22'; 【Bサーバ】「b.html」(表示用) <?php $data = file_get_contents ('http://www.A/a.txt'); foreach (explode("\n" , $data) as $value) { if (preg_match ("/\\$(.+)='(.+)'/", $value, $matches)) { $$matches[1] = $matches[2]; } } echo '<table>'; echo '<tr><th>'.$name01.'</th><td>'.$age01.'</td></tr>'; echo '<tr><th>'.$name02.'</th><td>'.$age02.'</td></tr>'; echo '</table>'; ?> ここで質問なのですが、↑のような仕組みで、a.txtの中身が $name03='三太'; $age03='33'; $name04='~~'; $age04='~~'; と増えていった場合、b.htmlの echo '<tr><th>'.$name~~.'</th><td>'.$age~~.'</td></tr>'; が自動的に増えてくれるようなものを作りたいと考えています。 配列(?)を使うという方法も調べてみたのですが、分からず……。 ご教示願います。

    • ベストアンサー
    • PHP
  • PHP実行時の警告について

    こんばんわよろしくお願いします。 aaacafeのレンタルサーバーでPHPのバージョンは4.2.3です。 Mysqlに接続して結果を一行づつ表示したいのですが 実行時に下記の2行警告が出てヘッダ部分しか表示しません。 自分で調べてぼんやりとは原因はわかったのですが、 具体的にどう直してよいかわかりません。 ご教示お願いします。 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource 以下ソースです。 <?PHP $sql = ""; $sql .= "select * from LIVE"; $sql .= " ORDER BY DATE DESC"; ?> <HTML> <HEAD> <TITLE>接続テスト</TITLE> </HEAD> <BODY> <?php //SQL発行 $rs = mysql_query($sql, $conn); echo "<table cellSpacing=0 cellPadding=0>\n"; echo "<tr bgcolor=yellow>"; echo "<th >日付</th>"; echo "<th>ツアータイトル</th>"; echo "<th>会場</th>"; echo "<th>アーティスト</th>"; echo "</tr>\n"; ■この行→ while( $rec = mysql_fetch_array( $rs, MYSQL_ASSOC ) ){ echo "<tr>\n"; echo "<td>" . _hs($rec['DATE']) . "</td>\n"; echo "<td>" . _hs($rec['TITLE']) . "</td>\n"; echo "<td>" . _hs($rec['PLACE']) . "</td>\n"; echo "<td>" . _hs($rec['ARTIST']) . "</td>\n"; echo "</tr>\n"; } //結果セットの解放 ■この行→ mysql_free_result( $rs ); //切断 mysql_close($conn); echo "</table>"; ?> </BODY> </HTML>

    • ベストアンサー
    • PHP
  • PHPの多次元配列について

    HTMLでホームページを作れる以外はプログラムに関しほぼ素人です。 環境 XAMPP1.70(最新)にてアパッチなど一括ダウンロード PHP言語にて3×4の表で以下の数値を多次元配列にて作成しようと思っているのですが、当方初心者なもので、 以下のコード(細かい部分は省略しています)、特にforeachがネストになっている部分の処理の流れがいまいちよくわかりません ~~~~~~~~~~~~~~~~~~~~~~~~~ <table border=2> <th>都市名</th> <th>最高気温</th> <th>最低気温</th> <?php  $data=array( array("東京"32,25) array("名古屋",45,67) array("埼玉",32,67) array("大阪",86,34) ) foreach($data as $city){ print "<tr>"; foreach($city as $value){ print "<td>{$value}</td>"    ●1回目foreachからここまでの流れがいまいち分かりません } print "</tr>"; ?> ~~~~~~~~~~~~~~~~~~~~ 一つ目のforeachにて、配列$dataが指定されていますので外側の配列を処理していくと思うのですが、具体的にどういう順番で処理されていくのでしょうか。 またforeach()の中の"$cityが最終的に$valueに格納という形になっていますが、10~13行目のarray("東京",32,25)とどのような関係で処理されていっているのか教えていただけませんでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP