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

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

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

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

Q&A

解決済

1回答

3872閲覧

PHPで配列を分割してforeachで出力

ssk

総合スコア332

PHP

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

0グッド

0クリップ

投稿2017/06/02 07:08

###前提・実現したいこと
$queryに5万のデータが入っています。
foreachで5万件をループさせると以下のエラーが出ます。

ここにご自身が実行したソースコードを書いてください

そこで、$queryを1万件に分割し
それぞれをforeachで出力したいです。

###該当のソースコード

PHP

1foreach ($query as $data) { 2 $data = [ 3 $data['id'], 4 $data['name'] 5 ]; 6 fputcsv($fp, $data); 7 }

###補足情報
前回の質問
https://teratail.com/questions/78718#reply-123901

yambejp様の助言
$queryを1万件に分割して、foreachで出力の方法が自分の実力ではできず、、どのように実装すればいいのでしょうか。

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

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

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

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

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

shi_ue

2017/06/02 07:13

5万件のデータを取得する前に分けられないんでしょうか?
ssk

2017/06/02 07:17 編集

難しいです。5万件のデータを取得後だと分割は厳しいでしょうか?
shi_ue

2017/06/02 07:19

一件当たりかなり大きいのでしょうか?
ssk

2017/06/02 07:21

1件あたり、データベース上で数えると18個のカラムです。
ssk

2017/06/02 07:22

ただ、idだけで出力しようとしてもメモリ不足になります。
ssk

2017/06/02 07:25

※追記 もう一度、IDのみの場合を試したところ、「このサイトにアクセスできません」のページは表示されてしまいますが、CSVダウンロードはできました。
m.ts10806

2017/06/02 07:34 編集

幾つか質問はわけてはいるものの組み合わせると結果的に丸投げになっている気がするんですが・・・。気のせいならいいんですが。
ssk

2017/06/02 07:38

matsu様 申し訳ございません。配列の分割方法が自分でイメージできず、前質問とは質問が異なるため、別の質問を立ち上げようと判断しました。
guest

回答1

0

ベストアンサー

$queryに入っているというのがいまいち状況がわかりませんが

SQLで処理しているならまず最初に全体件数を把握。
その上で、LIMITを指定して取得すれば一度にオンメモリに乗る量は減るでしょう

そうではなく配列を分割する方はこんな感じ

PHP

1$a=array_chunk(range(1,550),10); 2print_r($a); 3

550件のデータを@10件/行×55行にもっていたとして

PHP

1$b=array_chunk($a,5); 2print_r($b); 3

@10件/行×@5行/グループ×11グループにわけます

まとめて

PHP

1$a=array_chunk(range(1,550),10); 2print_r($a); 3$b=array_chunk($a,5); 4print_r($b); 5$fp=fopen("test.csv","w+"); 6foreach($b as $c){ 7foreach($c as $d){ 8fputcsv($fp, $d); 9} 10} 11fclose($fp);

投稿2017/06/02 07:31

yambejp

総合スコア114775

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問