人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpの勉強をしています。
ある配列の要素を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|";
}

●質問者: tontonpokopoko
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:PHP print リンク 勉強 検索サイト
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kn1967
●100ポイント
# てすと用データ準備
$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
◎質問者からの返答

回答をありがとうございました。

表示の仕方で悩んでいましたが

変数作り、$result[$p][0];と並べてやればいいんですね。

参考になりました!


2 ● taichino
●50ポイント

実際はデータベース等と連携がありますので、

もう少し複雑になりますが、該当処理を書いてみました。


ページ数が増えた時の事を考えると、

現在のページの要素だけを抜き出すのも良いかもしれません。


少しややこしいのは件数からページ数の計算でしょうか。

要素数がページあたりの件数で割り切れるかどうかを考える必要があります。

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 ● kn1967
●100ポイント ベストアンサー

(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 という環境変数を利用する手があるのですが

こちらも話がさらに膨らみますので今回は割愛します。

# 実は、いまやろうとなさっていることを正確かつ安全に行おうとすれば

# 本が一冊書けたりするような内容なのですよね・・・。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ