得点ランキング
順位 | 名前 | 得点 |
{順位}位 |
{登録名} |
{スコア}点 |
EOD
;
/* --------------------------------------------------------
・入力
a. フォームデータ
( POST )
フォーマット
"name" : 登録名
"score" : スコア
( GET )
"reload" : リロード用のランダム文字
b. 順位データファイル : "rank.txt" (tab区切り)
・出力
a. 順位データファイル : "rank.txt" (tab区切り)
・呼び出しパターン
(登録) or (閲覧のみ)
--------------------------------------------------------- */
// @ 初期化
$flgSame = 0; // @ 同じ登録名があったかどうか
$cntInputRec = 0; // @ 順位データレコード数
$frm_name = ''; // @ フォームからきた登録名
$frm_score = 0; // @ フォームからきたスコア
// @ POSTで送信されたフォームデータを受け取る
// (アスキー文字以外ならurlencodeにかける
$frm_name = urldecode($_POST['name']);
$frm_score = $_POST['score'];
// @ 順位データファイルを読み込み、配列にレコードを格納
$aryInputRec = file("rank.txt");
// @ レコード数を格納
$cntInputRec = count($aryInputRec);
// @ レコード数分だけ処理を繰り返す
for ($i = 0; $i < $cntInputRec; $i++) {
// @ tab区切りレコードからフィールドを切り抜いて変数格納
list($tmp_name, $tmp_score) = split("\t", $aryInputRec[$i]);
// @ 空白除去
$tmp_score = rtrim($tmp_score);
// @ ワーキングアレイにそれぞれ格納
$aryWorkName[$i] = $tmp_name;
$aryWorkScore[$i] = $tmp_score;
// @ 同じ登録名があるかどうかチェック
if( ($frm_name == $tmp_name) && $frm_name )
{
$flgSame = 1;
// @ 登録されている値よりも大きければ更新
if( ($frm_score > $tmp_score) && $frm_score)
{
print MSG_SCORE_UPDATE ."
";
// @ フォームデータの方を格納する
$aryWorkScore[$i] = $frm_score;
}
}
}//for>
// @ 登録要求での呼び出しかどうか
if( $frm_score && $frm_name)
{
// @ 登録がある場合は処理する
// @ 同じ登録名があったかどうか
if($flgSame == 0 ){
// @ 無ければ一番後ろにデータを追加
print MSG_SCORE_ADD ."
";
$aryWorkScore[$cntInputRec] = $frm_score;
$aryWorkName[$cntInputRec] = $frm_name;
}
// @ 配列を同時に降順にソートする
array_multisort ($aryWorkScore,SORT_DESC, $aryWorkName);
// @ 同じ得点の場合同じ順位にするかどうか
// ※ 一定数以上あったら下から1つ切る
if (count($aryWorkName) > NUM_RANK_UPPER )
{
array_pop($aryWorkName);
array_pop($aryWorkScore);
}//
// @ 書き込み用ファイルをオープンする
$fp = fopen('rank.txt', 'r+');
// @ ファイルロック
flock($fp, LOCK_EX);
// @ トランケート
ftruncate($fp, 0);
// @ ワークアレイのレコード数分だけ繰り返す
for ($i = 0; $i < count($aryWorkScore); $i++) {
// @ ファイルへのレコード書き込み ( tab 区切り)
fputs($fp,
( $aryWorkName[$i] . "\t" . $aryWorkScore[$i] . "\n" )
);
}//for>
// @ ファイルクローズ
fclose($fp);
}//if 登録か閲覧か>
// @ { 出力準備・出力フェーズ }
// @ 初期化
$strOutDoc = ''; // @ 出力HTML
$rankCount = 0;
$currRank = 0; // @ カレントのランク
$name;
$score;
$last_score = 0;
$strReplacedField = ''; // @ データ置換後のフィールドHTML
// @ 出力HTMLの作成ループ
for($i =0; $i < count($aryWorkScore); $i++) {
$name = $aryWorkName[$i];
$score = $aryWorkScore[$i];
// @ 前のスコアと違えば順位をインクリメント
if($aryWorkScore[$i] != $last_score) $rankCount++;
// @ 出力文字変数に足し込むための準備
$strReplacedField = $strFieldText;
$strReplacedField = str_replace("{順位}" , $rankCount ,$strReplacedField);
$strReplacedField = str_replace("{登録名}", $name ,$strReplacedField);
$strReplacedField = str_replace("{スコア}", $score ,$strReplacedField);
// @ 足し込む
$strOutDoc .= $strReplacedField ."\n";
// @ カレントのランクを登録
if($name == $frm_name) $currRank = $rankCount;
// @ 前回スコア保持
$last_score = $aryWorkScore[$i];
}//for>
// @ 該当する順位結果の出力
if($currRank!=0) print "$frm_nameさんの現在の順位は「 $currRank 位」です。\n";
// @ 最終出力(HTML本体出力)
print $strOutDoc;
?>