プロが教えるわが家の防犯対策術!

例えばPHPで下記のようなdata.csvがあります

NO,種類,入荷日,出荷日
1,りんご,2010/06/10,2010/06/30
2,みかん,2010/03/10,2010/04/30
3,かき,2010/05/10,2010/05/30



これらをPHPで読み込んできて入荷日順に10件ずつ表示するプログラムを書きたいのですが
本も三冊買ってきたり、掲示板のソースとかをみて参考にできるかと思ったりしたのですが当方初心者でしてどうも難しく行き詰っております。

data.csvから1行ずつ取り込んできて、3番目の数字でソートするといいというのは分かるのですが
どうもその方法がわかりません。
何かアドバイス頂ければ幸いです。

A 回答 (3件)

他にも何か良い方法がある気がしますが、ざっくり書いてみました。



ページネーションなんて気の効いたものはありません。

<?
$me = $_SERVER[SCRIPT_NAME];

$DimData = array();
// テスト用ゴミ配列作成
for($i=0;$i<20;$i++) { $DimData[$i] = sprintf("%03d" , $i); }

// 1ページに表示する最大数
$row = 10;

$Page = $_GET[Page];

// 最初のアクセス用
if (!$Page) { $Page = 1; }

// ページの最大数を算出(なんか計算が怪しい)
$PageLimit = (int) ((count($DimData)-1) / $row) + 1;

// 10行表示
for ($i=0;$i<$row;$i++) {
print $DimData[((($Page - 1) * $row) + $i)] . "<br>";
}

// 戻るリンク
$Back = ($Page > 1) ? "<a href=$me?Page=" . ($Page - 1) . ">1ページ戻る</a>" : "<font color=gray>1ページ戻る</font>";
// 進むリンク
$Next = ($Page < $PageLimit) ? "<a href=$me?Page=" . ($Page + 1) . ">1ページ進む</a>" : "<font color=gray>1ページ進む</font>";

print "<hr>$Back ($Page / $PageLimit) $Next<hr>";
?>
    • good
    • 0
この回答へのお礼

親切丁寧なご回答をありがとうございました

回答内容を参考に精進してまいりたいと思います。
ありがとうございました

お礼日時:2010/07/21 00:10

考え方は2つ。



1.ひとつは全部のデータを配列に読んでしまって、ソートをする。
配列のソート処理は比較的高速なのでソート処理はプログラムにまかせます

2.読みこむ際に、上位10個のデータを順次配列にいれていく
あらたに上位にきたら下位からデータをすて、上位にいれます。

1は処理は簡便で、データの汎用性や再利用性がたかいですが、データ量が増えたときに、
無駄にメモリをくい、処理がおそくなります。
2はデータ量に依存せず効率的な処理ですが、冗長なため、ソートしたい項目ごとに
フローの調整が必要になります。

大規模なデータを取り扱うときはデータベースを活用することになります。
    • good
    • 0
この回答へのお礼

なるほど、ありがとうございます。
データベースまでは必要ないかなと思いました。

お礼日時:2010/07/09 14:38

ざ~っと、ゴミプロ書いてみました。


参考になれば幸いです。

<?
$DimData = array();
// とりあえず、CSVファイルを二次元配列に取り込み。
$fp = fopen("data.csv" , "r");
while ($DimJob = fgetcsv($fp , 1000 , ",")) {
$DimData[] = $DimJob;
}
fclose($fp);

// ソート前
print_r($DimData);

// ユーザー定義関数でソート
usort($DimData, "cmp");

// ソート後
print_r($DimData);

// 多分、日付の比較の仕方としてはおかしいけど、とりあえず動くみたい。
function cmp($cmp01, $cmp02) {
// 入荷日で比較
return strcmp($cmp01[2], $cmp02[2]);

// ↓こうすると出荷日で比較
//return strcmp($cmp01[3], $cmp02[3]);
}
?>
    • good
    • 0
この回答へのお礼

親切丁寧にありがとうございます。

このあと、10件ずつ表示させるのに参考になる情報ありませんでしょうか?

お礼日時:2010/07/09 14:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!