質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

composer

Composerとは、PHP5.3.2以上で使用可能なパッケージ管理ツールです。指定ディレクトリ内だけでパッケージ管理します。

Q&A

0回答

543閲覧

複数のイベント情報が上書きされて表示される

of_the_Europa

総合スコア66

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

composer

Composerとは、PHP5.3.2以上で使用可能なパッケージ管理ツールです。指定ディレクトリ内だけでパッケージ管理します。

0グッド

0クリップ

投稿2022/01/03 03:33

今回の件、どのような状態かというとLaravelのコントローラー側でスクレイピングした内容を、リストとしてviewに全件表示させようとすると、最後の情報だけが件数分リストにずらっと表示されてしまうのです。

viewはこのようになっています。
イメージ説明

logを確認すると、このようになっています。
ループするごとに1件、1件2件、1件2件3件、1件2件3件4件...
と増えていけばいいと思うのですが、これを見ると2回目のループでは既に1件目は2件目に上書きされています。
イメージ説明

こちらはコントローラーの問題のメソッドになります。

public function event_list(){ $client = new Client(HttpClient::create(['verify_peer' => false, 'verify_host' => false]));     // 配列をviewに渡すと表示できなかったのでオブジェクトを生成しました。 $obj = new \stdClass(); // テーブル情報からスクレイピングに必要な情報を呼び出しています $sql_42 = 'select url, element_path from scrape where id = 42'; $s_42 = DB::select($sql_42);      // テーブル情報をもとに、取得したい項目をそれぞれループして取得しています foreach($s_42 as $data){ $url = $data->url; $crawler = $client->request('GET', $url); $link = $crawler->filter($data->element_path)->filter('ul > li > a') ->each(function($node){ return $node->attr('href'); }); $src = $crawler->filter($data->element_path)->filter('div > img') ->each(function($node){ return $node->attr('src'); }); $alt = $crawler->filter($data->element_path)->filter('div > img') ->each(function($node){ return $node->attr('alt'); }); $text = $crawler->filter($data->element_path)->filter('p.campaign_banner_term') ->each(function($node){ return $node->text(); }); Log::debug($link); } $imageAnnotator = new ImageAnnotatorClient(); $seiyu = []; $shop_count = 0;      // スクレイピングで取得したimg要素をOCR処理しています。 for($i = 0; $i < count($src); $i++){ $path = 'https://www.seiyu.co.jp' . $src[$i]; $image = file_get_contents($path); $response = $imageAnnotator->documentTextDetection($image); $annotation = $response->getFullTextAnnotation(); # Log::debug out detailed and structured information about document text if ($annotation) { $allblockText = ''; foreach ($annotation->getPages() as $page) { foreach ($page->getBlocks() as $block) { $block_text = ''; foreach ($block->getParagraphs() as $paragraph) { foreach ($paragraph->getWords() as $word) { foreach ($word->getSymbols() as $symbol) { $block_text .= $symbol->getText(); } } $block_text .= " "; // Log::debug($block_text); } $allblockText .= $block_text; } } } $imageAnnotator->close();        // これまでに取得したリンク要素や画像文書をそれぞれのプロパティにセットしています $eventLink = 'https://www.seiyu.co.jp' . $link[$i]; $obj->eventLink = $eventLink; $obj->text = $text[$i]; $obj->alt = $alt[$i]; $obj->img_text = $allblockText; $seiyu[$shop_count] = $obj; $shop_count++; Log::debug($seiyu); }            // オブジェクトを配列の中にセットしました $output = []; $output['seiyu'] = $seiyu; return view('eventList', $output); }

こちらはviewになります

<body> <div class="pb-3"> @if(isset($seiyu)) <h4>西友</h4> <ul> @foreach($seiyu as $data) @if(!empty($data->img_text) or !empty($data->text)) <li> <a href="{{ $data->eventLink }}" target="_blank">{{ $data->img_text }}</a> <small>{{ $data->text }}</small> </li> @endif @endforeach </ul> @endif </div> </body>

ここでのオブジェクトクラスの使用法にはあまり自信はありません。
とりあえずは上書させずに1件ずつ表示させたいです。
どうかお力をいただければ幸いですm(__)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問