- ベストアンサー
配列を分割したいのですが
すいません。php初心者なのですが質問があります。画像の並び変えをphpでやりたいと思っています。 (新着順や、特定の種類のみ表示などができるウェブサイトを作っています) ただ量が300~500以上あるため、50区切りぐらいにして、「次のページ」を押すと51~100・・ みたいな感じが希望なのですが、こういうのは通常どういう関数を使うのでしょうか? 他の部分は大体できたのですが、配列の分割が良く分からず、array_chunk という関数を使うとできそうなのですが、既に画像の配列プログラムでforeachで何度も使っているため、 さらにforeachで回すとページ表示が異常に重くなったりしそうで不安です。 検索結果をページで分けるというのは比較的どのウェブサイトでも見るのですが皆さんどのような関数を使ってるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
すでに全件を配列に入れているのであれば、わざわざ分割する必要はないと思います。 配列の添え字が連番でなければforeachで回すしかありませんが、それでも『所定の件数までcontinueで読み飛ばす』くらいは、さほどの負荷でもありません。 (e.g.) <?php // デバッグ用データ作成 $array = array(); for ($i = 1; $i <= 510; $i++) { $array[] = sprintf("data-%03d", $i); } // 初期セット $max = 15; $page = isset($_GET['page']) ? $_GET['page'] : 1; $pmax = ceil((count($array) / $max)); if ($page > $pmax) { $page = $pmax; } $skip = ($page - 1) * $max; // 表示処理 $rct = 0; $dct = 0; foreach ($array as $val) { if ($rct++ < $skip) { continue; } $dct++; if ($dct > $max) { break; } printf("%02d : %03d : ", $dct, $rct); // 確認用 print $val . "<br />"; } if ($page > 1) { // 2ページ目以降 print ('<a href="?page=' . ($page - 1) . '">Prev.</a> | '); } else { print ('Prev | '); } if ($dct > $max) { // $dct > $max でbreak => 次のデータがある print ('<a href="?page=' . ($page + 1) . '">Next.</a>'); } else { print ('Next.'); }
その他の回答 (2)
- hige_mario
- ベストアンサー率51% (18/35)
回答1の方と同意ですが、300~500程度の配列ならforeachで回しても大した負荷では無いと思います。既に配列(ハッシュになってるのかな?)であれば条件に合わせてforeach数回で目的は果たせるでしょう。多分、管理数 数千程度ならこれで十分だと思います。 (サーバースペックも知らんのにいい加減な奴で失敬!) 回答2の方に賛成する部分では。管理数が10万とか100万とか超えてくる場合はSQLでの管理を強くお勧めします。いくらうまくハッシュ管理しても、ジャッジ数が増えると負荷が重くなります。初心者の方には敷居が高く感じるかもしれませんが、SQLで管理するほうが簡単だったり、スマートに処理できるので、開発コストも下がりますよ。 このさいSQLにもトライしてみては! ^-^
お礼
ご回答ありがとうございます。
- Yune-Kichi
- ベストアンサー率74% (465/626)
ページングのための処理は,だいたいSQL側で処理しますね。 ROW_NUMBERウィンドウ関数とBETWEENを使ったり,MySQLのLIMITを使ったり。 全件を配列にしているのであれば, ・foreachではなくインデックスによるアクセスを行う ・array_sliceで必要な部分だけの配列を取得する あたりで処理します。 # HTTPはステートレスなので,基本的に「今回の通信に無関係な部分」は持っていても仕方がない
お礼
サンプルまで書いていただいてありがとうございます。 一度continueで検討してみます。