現在使用しているPHPにページャーを付けたいと奮闘しているのですが、小生PHPはまだまだ初心者でうまくいきません。
下は管理画面より生年月日や時間を入力することにより、個人のプロフィール等を表示できる表示画面のPHPなのですが、仮に管理画面より100人分入力すると、表示画面に100人表示されてしまうため、それをページャーにて例えば10人分づつ表示するといったものに出来ればと思っております。
回答される方のためにどのようなことを記載しなければいけないのか等もあまり分からない状態で、下に記載している分で不十分かも知れないのですが、足らない分はご指摘を頂ければ可能な限りコメントにて記載させて頂きますのでどうぞよろしくお願いいたします。
PHP Version 5.2.11
-------------
<?php
$fc = 16;
mb_http_output("SJIS");
mb_internal_encoding("UTF-8");
ob_start( 'mb_output_handler' );
require_once('../Smarty.class.php');
// create object
$smarty = new Smarty;
// template, cache, configuration files
$smarty->template_dir = '../templates/';
$smarty->compile_dir = '../templates_c/';
$smarty->config_dir = '../configs/';
$smarty->display('i_header1.tpl');
if (file_exists("../1.txt")){
$file_data = file("../1.txt");
}
//
$arry_cnt = count($file_data)/$fc;
$i=0;
$j=0;
while($i<$arry_cnt){
if (ereg_replace("\n","",$file_data[$i*$fc+15]) == "1"){
$wait_data[$j][rank] = ereg_replace("\n","",$file_data[$i*$fc+0]);
$wait_data[$j][s_name] = ereg_replace("\n","",$file_data[$i*$fc+1]);
$wait_data[$j][old_years] = ereg_replace("\n","",$file_data[$i*$fc+2]);
$wait_data[$j][body_style] = ereg_replace("\n","",$file_data[$i*$fc+3]);
$wait_data[$j][work_time] = ereg_replace("\n","",$file_data[$i*$fc+4]);
$wait_data[$j][time_wait] = ereg_replace("\n","",$file_data[$i*$fc+5]);
$wait_data[$j][comment] = ereg_replace("\n","",$file_data[$i*$fc+6]);
$wait_data[$j][pic_path] = ereg_replace("\n","",$file_data[$i*$fc+7]);
$wait_data[$j][img_href] = ereg_replace("\n","",$file_data[$i*$fc+8]);
$wait_data[$j][name_href] = ereg_replace("\n","",$file_data[$i*$fc+9]);
$wait_data[$j][i_href] = ereg_replace("\n","",$file_data[$i*$fc+10]);
$diff = ereg_replace("\n","",$file_data[$i*$fc+11]);
if (ereg_replace("\n","",$file_data[$i*$fc+11]) > time()) {
$diff = ceil($diff - time());
$m_diff = ceil($diff / 60);
$h_diff = ceil($diff / (60*60));
$d_diff = ceil($diff / (60*60*24));
if ($m_diff <= 60) {
if ($m_diff <= 5) {
$wait_data[$j][time_wait] = '5分待ち';
} elseif ($m_diff <= 10) {
$wait_data[$j][time_wait] = '10分待ち';
} elseif ($m_diff <= 15) {
$wait_data[$j][time_wait] = '15分待ち';
} elseif ($m_diff <= 30) {
$wait_data[$j][time_wait] = '30分待ち';
} elseif ($m_diff <= 45) {
$wait_data[$j][time_wait] = '45分待ち';
} else {
$wait_data[$j][time_wait] = '60分待ち';
}
} elseif ($h_diff <= 24) {
$wait_data[$j][time_wait] = "".$h_diff . '時間待ち';
}
}
$j++;
}
$i++;
}
function cmp($a, $b)
{
return strcmp($a["rank"], $b["rank"]);
}
usort($wait_data, "cmp");
$i=0;
while($j>$i){
$smarty->assign("img_href", $wait_data[$i][img_href]);
$smarty->assign("pic_path", $wait_data[$i][pic_path]);
$smarty->assign("i_href", $wait_data[$i][i_href]);
$smarty->assign("name_href", $wait_data[$i][name_href]);
$smarty->assign("s_name", $wait_data[$i][s_name]);
$smarty->assign("old_years", $wait_data[$i][old_years]);
$smarty->assign("body_style", $wait_data[$i][body_style]);
$smarty->assign("work_time", $wait_data[$i][work_time]);
$smarty->assign("time_wait", $wait_data[$i][time_wait]);
$smarty->assign("comment", $wait_data[$i][comment]);
$smarty->display('i_wait2.tpl');
$i++;
}
$smarty->display('i_footer1.tpl');
?>
No.1ベストアンサー
- 回答日時:
ページャーの実装方法はいろいろありますが、一番簡単なものを実装してみました。
実装するに当たり、大分スクリプトを書き換えてしまいましたが、ご勘弁を。
18行目あたりの記述と、53行目あたりの記述、また、create_pager関数のあたりがページャーの実装というところです。
<?php
define('FC', 16);
define('DATA_LIMIT', 10);
define('LOG_FILE_PATH', '../1.txt');
mb_http_output('SJIS');
mb_internal_encoding('UTF-8');
require_once '../Smarty.class.php';
$DATA_KEYS = array(
'rank', 's_name', 'old_years',
'body_style', 'work_time', 'time_wait',
'comment', 'pic_path', 'img_href',
'name_href', 'i_href'
);
$page = 1;
if(isset($_GET['page'])){
$page = (int) $_GET['page'];
if($page == 0) $page = 1;
}
ob_start('mb_output_handler');
$smarty = new Smarty();
$smarty->template_dir = '../templates/';
$smarty->compile_dir = '../templates_c/';
$smarty->config_dir = '../configs/';
$smarty->display('i_header1.tpl');
if (file_exists(LOG_FILE_PATH) && is_readable(LOG_FILE_PATH)){
$wait_data = array();
$fp = fopen(LOG_FILE_PATH, 'r');
while(!feof($fp)){
$buff = array();
for($j=0; $j<FC; $j++){
$buff[] = rtrim(fgets($fp, 4096));
}
if(isset($buff[FC-1]) && $buff[FC-1] == "1"){
$wait_data[] = format_array($buff);
}
}
if(!empty($wait_data)){
usort($wait_data, "cmp");
$start = ($page - 1) * DATA_LIMIT;
$end = ($page * DATA_LIMIT);
$data_count = count($wait_data);
if($data_count <= $end){
$end = $data_count;
}
for($i=$start; $i<$end; $i++){
foreach($DATA_KEYS as $key){
$smarty->assign($key, $wait_data[$i][$key]);
}
$smarty->display('i_wait2.tpl');
}
$smarty->assign('pager', create_pager($data_count, $page));
$smarty->display('i_footer1.tpl');
}else{
exit('logがありません');
}
}else{
exit('logファイルが開けません');
}
function create_pager($data_count, $this_page){
$script = $_SERVER['PHP_SELF'];
$pages = ceil($data_count / DATA_LIMIT);
$ret = array();
for($i=1; $i<$pages+1;$i++){
if($i == $this_page){
$ret[] = $i;
}else{
$ret[] = '<a href="'.$script.'?page='.$i.'">'.$i.'</a>';
}
}
return implode(' | ', $ret);
}
function format_array($data){
global $DATA_KEYS;
$ret = array();
foreach($DATA_KEYS as $num => $name){
$ret[$name] = $data[$num];
}
$wait_time_str = get_wtime_str($data[$num+1]);
if($wait_time_str !== false){
$ret['time_wait'] = $wait_time_str;
}
return $ret;
}
function get_wtime_str($diff){
$time = time();
if($diff <= $time) return false;
$diff = ceil($diff - $time);
$m = ceil($diff / 60);
$h = ceil($diff / (60*60));
$d = ceil($diff / (60*60*24));
if($m <= 60){
$num = 60;
for($i=5; $i<60; $i+=5){
if($m <= $i){
$num = $i;
break;
}
}
return "{$num}分待ち";
}elseif($h <= 24){
return "{$h}時間待ち";
}
return false;
}
function cmp($a, $b){
return strcmp($a['rank'], $b['rank']);
}
?>
hogehoge78様
回答ありがとうございました。
たいへん助かりました。
早速試してみたところ、うまく動作しました。
ところでhogehoge78様が作られたものではフッターのテンプレートにpagerを挿入することで表示することは出来たのですが、ヘッダーのテンプレートに挿入した時は、表示が出来ませんでした・・。
仮にヘッダーのテンプレートにも表示させたい場合は、なにか付け加える必要があるのでしょうか?
また質問と少し離れるかも知れませんが、最初に当方で掲載したスクリプトを書き換えられた理由を教えていただけますでしょうか?
恥ずかしながらどうして書き換える必要があったのかすら、分からないのです・・。
お手隙な折にご回答くださいませ。
No.2
- 回答日時:
■ヘッダにもページャを表示するために
>$smarty->display('i_header1.tpl');
の記述を、
$data_count = count($wait_data);
の後ろに持ってきて、
$smarty->assign('pager', create_pager($data_count, $page));
の記述を、$smarty->display('i_header1.tpl');
の上に持ってくれば恐らくいけます。
■なぜ書き換えたのかについて
ページャの実装は、ソース見ていただくと分かるとおり、
取得したデータの件数をカウントする必要があります。
また、適当なことを書いて実際に上手く動かないといった場合
何度も修正コードを投稿せねばならない可能性があります。
その為、今回質問者さんの投稿されたソースを理解する必要があり、
かつ、どこに挿入すれば上手く動くかを検討するために
一度テスト環境に同様なディレクトリ構成(require_onceや、file関数で取得しているパスとか)をつくって、実際に実行して試してます。
しかしながら、okwaveの投稿は、ソースのインデントが表示されないのと、今回のソースの内容が煩雑で分かりづらかった為、
理解した順番にソースを記述していきました。
その際、効率の悪い記述(関数にまとめたら楽そうな部分とか)や、
適していない関数(正規表現を使わない置換でereg_replaceを使うよりかは、str_replaceのほうが良い)などを適当に切り分けて
まとめてしまいました。
ついでに、PHPはまだ初心者と仰られていましたので、「こういう書き方も出来る」というのをお伝えしたかったというのもまた一つの理由です。
もし、問題があるのであれば、必要箇所(ページャの考え方)だけ抽出して、元のコードに当てはめて頂ければと思います。
回答ありがとうございました。
hogehoge78様の方法にてヘッダーにも表示することが可能になりました。
書き換えのことに関しては全く問題はないのですが、不思議に思った為伺いました。
PHPに関してはまだまだお伺いしたいことがございますが、色々試して挑戦し、壁にぶつかった際、あらためて質問をたてます。
この度は貴重なお時間を割いて頂き、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- 英語 be sorry for doingとbe sorry to have doneの意味の違いについて 2 2023/06/09 13:57
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
While文を使って配列の中身を全...
-
CSVデータの行数カウントをした...
-
多次元配列の一次元目の最大値...
-
ログファイルが一定行数を超え...
-
ヒアドキュメントの中のfor文
-
smartyのforeachの使い方
-
foreachのなかで次のキーを参照...
-
スカラーのベクトル微分
-
forとかで連番の変数を一気に格...
-
PHP 多次元配列変数のデータ受...
-
CSVデータのn番目だけの値を取...
-
$_SESSIONに二次元配列を使える...
-
3つの連想配列を交互に代入し...
-
多次元配列をソートする綺麗な...
-
プルダウンメニューにDBの内容...
-
unset使用時の利点
-
配列の書き方
-
String だと「 ByRef引数の型が...
-
multiple属性のPOSTを配列で受...
-
添え字が全て文字列のPHPの多次...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別ファイルの構造体の値を読み...
-
CSVファイルの最終行のデー...
-
stdClass Objectを連想配列のよ...
-
複数行のデータのPOST処理に関して
-
ヒアドキュメントの中のfor文
-
Resource id #3 と表示されま...
-
エラーメッセージ(無効な間接...
-
自動で番号を振りたい
-
PHPでCSVの一部の行を編集したい
-
C言語でCSVファイルの行数を読...
-
バイナリファイルの内容を、そ...
-
CSVデータの行数カウントをした...
-
ログファイルの古い日付の行を...
-
While文を使って配列の中身を全...
-
csvの内容を行単位で削除したい
-
多次元配列の一次元目の最大値...
-
pythonのファイルの並びでの読...
-
配列同士の足し算のループ処理
-
【PHP】csvファイルへの書き出...
-
配列をファイルに書き込む方法
おすすめ情報