ある配列の要素を5件ずつ表示させる方法を考えています。
検索サイトなどによくある感じで現在のページ以外を参照するには
要素数を5で割ったリンクが必要です。
//ここに要素が5つ(最後のページは5の余り数)
//移動のためのリンク
1|2|3|4|5|6|...
思いつきで以下のように書いてみましたが、
どうも続きがうまくいきません。よろしくお願いします。
$result = array();
$x = 0;
for($i=0;$i<count($fl_array);$i++){
$result[$x][] = $fl_array[$i];
if ($i % 5 == 4) {
$x++;
}
}
for($i=1;$i<=count($result);$i++){
print "$i|";
}
(3)新しいページ(リンク先)の処理の仕組み
今作っているページを
http://www.example.com/a.php
だとしますと
http://www.example.com/a.php?pg=1
というようにページ番号を受け取るようにします。
(ページ番号がなければゼロとします)
$p = 0;
という1行を
if(isset($_GET['pg'])){ $p = $_GET['pg'] - 1; } else { $p = 0; }
に書き換えます。
※セキュリティ上、本当はpgの値を検証したり、どこからアクセスされたのかを検証したりしなくてはならず
そもそもGETではなくPOSTが・・・などなど非常に話が長くなるので今回は割愛します。
(4)リンクをつける
$result_keys = array_keys($result); print join("|", $result_keys);
を
print "<br />\n"; $result_keys = array_keys($result); $result_keys_count = count($result_keys); for($i=0; $i<$result_keys_count; $i++){ if ($i <> $p) { $result_keys[$i] = '<a href="a.php?p=' . $result_keys[$i] . '">' . $result_keys[$i] . '</a>'; } } print join("|", $result_keys);
に変えます。一応、改行も入れときました。
※シングルクォーテーションで囲んだものは展開されませんので
¥でエスケープする必要がありません。
ダブルクォーテーションを使った場合は下記のようになりますが
複雑になってくると、どこがどこやら判りにくくなる場合もありますので
適宜使い分ける必要があります。
$result_keys[$i] = "<a href=\"a.php?p=$result_keys[$i]\">$result_keys[$i]</a>";
※a.php と書くのではなく SCRIPT_NAME という環境変数を利用する手があるのですが
こちらも話がさらに膨らみますので今回は割愛します。
# 実は、いまやろうとなさっていることを正確かつ安全に行おうとすれば
# 本が一冊書けたりするような内容なのですよね・・・。
# てすと用データ準備 $fl_array = array(1,2,3,4,5,6,7,8,9,10,11,12); # 配列に格納 $result = array(); $x = 0; $fl_count = count($fl_array); for($i=0; $i<$fl_count; $i++){ $result[$x][] = $fl_array[$i]; if ($i % 5 == 4) { $x++; } } # 格納したデータの確認用表示 print_r($result); print "<br />\n"; # 表示 $p = 1; $result_count = count($result[$p]); print $result[$p][0]; for($i=1; $i<$result_count; $i++){ print "|" . $result[$p][$i]; }
(1)前半部分
・forが一巡する度にcountしなおすのは効率悪いので変数 $fl_count 追加。
(2)後半部分
・欲しいページ用に変数 $p 追加。
・X = 0 なので2ページ目が欲しいとすれば 1 とする。
・forが一巡する度に・・・で $result_count 追加。
・余計な|が入らないようにするため先頭だけループ外に変更。
(2改)後半部分の改造
・|で結合するだけであればループしなくてもjoinという手もある。
# 表示する。 $p = 1; print join('|', $result[$p]);
既にご存知かもしれませんが
print_r(配列変数);
はよく使いますので覚えておいてください。
上記であればブラウザには
Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) [1] => Array ( [0] => 6 [1] => 7 [2] => 8 [3] => 9 [4] => 10 ) [2] => Array ( [0] => 11 [1] => 12 ) ) 6|7|8|9|10
と表示されますが、ソースを表示させれば以下のようになっているはずです。
Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) [1] => Array ( [0] => 6 [1] => 7 [2] => 8 [3] => 9 [4] => 10 ) [2] => Array ( [0] => 11 [1] => 12 ) ) <br /> 6|7|8|9|10
実際はデータベース等と連携がありますので、
もう少し複雑になりますが、該当処理を書いてみました。
ページ数が増えた時の事を考えると、
現在のページの要素だけを抜き出すのも良いかもしれません。
少しややこしいのは件数からページ数の計算でしょうか。
要素数がページあたりの件数で割り切れるかどうかを考える必要があります。
ceil関数を使用すると簡単にかけますね。
あと、個人的にはプログラム上のページ番号は0からなのに、
ユーザインターフェース的には1からという事が合わさって妙に
デバッグに手間取った事があります。
#!/usr/bin/php <?php /** * Usage: * count_array.php (ページ番号) */ # ページ番号は0基準か1基準か $base = 0;# $base = 1; # 表示するページをコマンドラインから取得 $current = $argv[1] - $base; # 検索結果のリンク $links = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','z','y','z'); $linkNum = count($links); # ページごとの要素数 $count = 5; # ページ数を計算 $pages = ceil($linkNum / $count); # 現在のページを表示 $start = $current * $count; $end = $start + $count; for ($i = $start; $i < $end; $i++) { if (isset($links[$i])) { print "<td> {$links[$i]} </td>" . "\n"; } } # 他のページへのリンクを表示 $start = $base; $end = $base + $pages; for ($i = $start; $i < $end; $i++) { print "<a>$i</a> "; } ?>
キーワードとしては「ページング、php」等で検索すると
参考情報がたくさんヒットするようです。
taichino0730さま、回答をありがとうございます。
コマンドラインの理解が難しいですが、
残りの処理はとても参考になります。
またページングという言葉のヒントを教えてもらって感謝です。
(私なりにかなり調べた後の質問だったのですが、”ページング”と言う言葉がわかりませんでした)
ページング検索で優しい説明のものもあったので、
1つ1つ試していきたいと思います。
(3)新しいページ(リンク先)の処理の仕組み
今作っているページを
http://www.example.com/a.php
だとしますと
http://www.example.com/a.php?pg=1
というようにページ番号を受け取るようにします。
(ページ番号がなければゼロとします)
$p = 0;
という1行を
if(isset($_GET['pg'])){ $p = $_GET['pg'] - 1; } else { $p = 0; }
に書き換えます。
※セキュリティ上、本当はpgの値を検証したり、どこからアクセスされたのかを検証したりしなくてはならず
そもそもGETではなくPOSTが・・・などなど非常に話が長くなるので今回は割愛します。
(4)リンクをつける
$result_keys = array_keys($result); print join("|", $result_keys);
を
print "<br />\n"; $result_keys = array_keys($result); $result_keys_count = count($result_keys); for($i=0; $i<$result_keys_count; $i++){ if ($i <> $p) { $result_keys[$i] = '<a href="a.php?p=' . $result_keys[$i] . '">' . $result_keys[$i] . '</a>'; } } print join("|", $result_keys);
に変えます。一応、改行も入れときました。
※シングルクォーテーションで囲んだものは展開されませんので
¥でエスケープする必要がありません。
ダブルクォーテーションを使った場合は下記のようになりますが
複雑になってくると、どこがどこやら判りにくくなる場合もありますので
適宜使い分ける必要があります。
$result_keys[$i] = "<a href=\"a.php?p=$result_keys[$i]\">$result_keys[$i]</a>";
※a.php と書くのではなく SCRIPT_NAME という環境変数を利用する手があるのですが
こちらも話がさらに膨らみますので今回は割愛します。
# 実は、いまやろうとなさっていることを正確かつ安全に行おうとすれば
# 本が一冊書けたりするような内容なのですよね・・・。
回答をありがとうございました。
表示の仕方で悩んでいましたが
変数作り、$result[$p][0];と並べてやればいいんですね。
参考になりました!