得点ランキング



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; ?>
順位名前得点
{順位}位 {登録名} {スコア}


設定 pass