2011.2.18 先日のちょっとした補足、キャラの名前間違ってたらごめんなさい

先日のアレですが、こんな感じで html が生成されます

http://trr.sakura.ne.jp/php-test/110217.php

ウンコなぺちぱーはこの世にソースコードを公開するなんて許されざる風潮を感じないでもないですが、まぁ大したことはやってないんで以下のような感じです。入力をなんとかして、配列をデータベースに格納すればもうちょい実用的ななにかになる可能性を感じないでもないけど、まぁ個人の道楽の為にコードなんて書いてなんぼなので(^o^)

よく分からない人に軽く補足しておくと、まぁ下記のコードの 49行目の $rank と、69行目の $rankNotes を追加していくだけで、以降は勝手に表を生成してくれるという話です。多少手間はかかってますが便利でしょ

// 表のタイトル
echo "<h2>【東方キャラソート 〜結果推移を php で可視化してみる〜】</h2>";
// 作品とキャラの対応を定義
function getTitleName($id) {
	$title = array(
		array(1,2,3,4,5,6,7,8,9), array(10,11,12,13,14,15,16,17,18,19,20), array(21,22,23,24,25,26,27,28,29),
		array(30,31,32,33,34,35), array(36,37,38,39,40,41,42,43), array(44,45,46,47,48,49,50,51),
		array(52,53,54,55,56,57,58), array(59), array(60,61), array(62), array(63,64), array(65,66,67),
		array(68,69), array(70), array(71,72), array(73), array(74,75,76));
	for($n=0;$n<count($title);$n++) {
		if(in_array($id,$title[$n])) break;
	}
	switch ($n) {
		case 0 : $col = "#A44"; $str = "東方紅魔郷"; break;
		case 1 : $col = "#88C"; $str = "東方妖々夢"; break;
		case 2 : $col = "#A4A"; $str = "東方永夜抄"; break;
		case 3 : $col = "#E88"; $str = "東方花映塚"; break;
		case 4 : $col = "#4A4"; $str = "東方風神録"; break;
		case 5 : $col = "#C60"; $str = "東方地霊殿"; break;
		case 6 : $col = "#28F"; $str = "東方星蓮船"; break;
		case 7 : $col = "#86F"; $str = "東方萃夢想"; break;
		case 8 : $col = "#C44"; $str = "東方緋想天"; break;
		case 9 : $col = "#888"; $str = "ダブルスポイラー"; break;
		case 11 : $col = "#CA4"; $str = "東方三月精"; break;
		case 12 : $col = "#888"; $str = "秘封倶楽部"; break;
		case 13 : $col = "#888"; $str = "東方求聞史紀"; break;
		case 14 : $col = "#888"; $str = "東方香霖堂"; break;
		case 15 : $col = "#C22"; $str = "東方茨歌仙"; break;
		case 16 : $col = "#888"; $str = "東方儚月抄"; break;
		default : $col = "#888"; $str = ""; break;
	}
	return "<span class='title' style='color:" . $col . ";'>" . $str ."</span>";
}
// キャラの名前を定義
$name = array( "ダミー",
	"ルーミア", "大妖精", "チルノ", "紅 美鈴", "小悪魔", "パチュリー・K", "十六夜 咲夜", "レミリア・S", "フランドール・S", "レティ・W",
	"橙", "アリス・M", "リリーホワイト", "リリカ・P", "メルラン・P", "ルナサ・P", "魂魄 妖夢", "西行寺 幽々子", "八雲 藍", "八雲 紫",
	"リグル・N", "ミスティア・L", "上白沢 慧音", "因幡 てゐ", "鈴仙・U・イナバ", "八意永琳", "蓬莱山 輝夜", "上白沢 慧音", "藤原 妹紅", "リリーブラック",
	"メディスン・M", "射命丸 文", "風見 幽香", "小野塚 小町", "四季 映姫・Y", "秋 静葉", "秋 穣子", "鍵山 雛", "河城 にとり", "犬走 椛",
	"守谷 早苗", "八坂 神奈子", "洩矢 諏訪子", "キスメ", "黒谷 ヤマメ", "水橋 パルスィ", "星熊 勇儀", "古明地 さとり", "火焔猫 燐", "霊烏路 空",
	"古明地 こいし", "ナズーリン", "多々良 小傘", "雲居 一輪", "村紗 水蜜", "寅丸 星", "聖 白蓮", "封獣 ぬえ", "伊吹 萃香", "永江 衣玖",
	"比那名居 天子", "姫海棠 はたて", "博麗 霊夢", "霧雨 魔理沙", "サニーミルク", "ルナチャイルド", "スターサファイア", "宇佐美 蓮子", "マエリベリー・H", "稗田 阿求",
	"森近 霖之助", "名無しの本読み妖怪", "茨木 華扇", "綿月 豊姫", "綿月 依姫", "レイセン2号");
// 画像が存在するキャラ
$imageExist = array(
	1,2,3,4,5,6,7,8,9,10,11,12,14,17,18,19,20,22,23,24,25,26,28,29,31,32,33,34,35,37,38,39,40,
	41,42,43,45,46,47,48,49,50,51,52,54,55,56,57,58,59,61,63,64,66,68,70,71,72,73,74);
// ランキング結果は取り敢えずここに格納
$rank = array(
	// 結果 1つ目
	array( 23,  8, 22, 48, 52, 59, 39, 33, 35, 19, 56, 46, 43, 51, 70, 41, 61, 20,  6,  4,
		   29,  1, 24, 12,  3,  2, 34, 45, 47, 49, 50, 71, 17,  7, 11,  9, 25, 26, 64, 63,
		   38, 40, 32, 18, 37, 42, 36, 31, 27,  5, 10, 14, 57, 58, 66, 65, 55, 44, 53, 54,
		   16, 21, 15, 13, 75, 74, 76, 60, 67, 69, 68 ),
	// 結果 2つ目
	array( 23, 56,  8, 22, 39, 19, 52, 48, 33, 46, 51, 20, 59, 35, 29, 70, 45, 24, 71, 47,
		   68,12,43,10,1,4,6,37,40,41,11,17,26,34,50,61,9,64,66,18,
		   7,3,63,2,49,32,72,69,36,25,38,58,53,57,31,5,55,54,14,16,
		   27,42,21,65,13,60,44,75,74,76,15,67 ),
	array( 56, 23, 22, 66, 45, 73, 58, 39,  8, 19, 46, 52, 48, 51, 43, 49, 55, 68, 72, 70,
		   50,1,31,59,24,35,32,9,33,4,41,6,29,10,12,11,20,25,26,47,
		   61,54,57,62,69,26,65,71,34,7,63,64,40,3,2,14,17,38,21,42,
		   18,16,15,13,74,30,60,5,44,53,67,75,76,36,37 )
);
// ランキングの個数をここで定義
define("RANKDATASIZE", count($rank));
define("CHARADATASIZE", count($rank[RANKDATASIZE-1]));
// ランキングの集計日時はここ
$rankNotes = array( "2009年11月08日", "2010年02月01日", "2011年02月14日" );
// キャラのランク上下によって出力される前回の結果との差分、を関数で定義して出力
function rankChangeText($rank,$i,$j) {
	if ($j!=0) {
		// $iは現在のランク位置、取得した$nは過去のランク位置、$rank[$j][$i]はキャラのID
		for($n=0;$n<count($rank[$j-1]);$n++) {
			if ( $rank[$j-1][$n] == $rank[$j][$i] ) break;
		}
		if ( $n-$i > 0 ) return "<span class='rankChange' style='color:#F44;'>(+" . ($n-$i) . ")</span>";
		if ( $n-$i < 0 ) return "<span class='rankChange' style='color:#44F;'>(" . ($n-$i) . ")</span>";
	} return "<span class='rankChange' style='color:#888;'>(0)</span>";
}
/*ここからテーブル要素*/
echo "<table border='0' cellspacing='0' cellpadding='0'><tbody>\n";
echo "<tr class='tr_head'><td class='td_head'>No.</td>";
for ( $i=0;$i<RANKDATASIZE;$i++ ) {
	echo "<td class='rank_notes' colspan='3'>" . $rankNotes[$i] . "</td>";
}
/* ↑ ヘッダ ↓ 要素 */
for ( $i=0; $i<CHARADATASIZE; $i++ ) {
	echo "<tr><td class='td_head td_head_element'>" . ($i+1) . "</td>";
	for ( $j=0; $j<RANKDATASIZE; $j++ ) {
		if ( $i < count($rank[$j]) ) {
			// 画像を表示、三項演算子で画像がないキャラは 00.png を表示
			echo "<td class='td_image'><img src='img2/" . (in_array($rank[$j][$i],$imageExist)?sprintf("%02d", $rank[$j][$i]):sprintf("00")) . ".png' style='float:left;' width='32px' height='32px'></td>";
			// ランキング上下、キャラクター名、作品名 を表示
			echo "<td class='td_change'>" . rankChangeText($rank,$i,$j) . "</td><td class='td_name'>" . $name[$rank[$j][$i]] . "<br />" . getTitleName($rank[$j][$i]) ."</td>\n";
		} else {
			// キャラが存在しない場合は空要素を挿入
			echo "<td class='td_none'colspan='3'></td>";
		}
	}
	echo "</tr>";
}
echo "</tbody></table>";

ついでにスタイルシートが以下、すごいどうでもいいね!!

table, tr, td, tbody, p, img {
	margin : 0px;
	padding : 0px;
}
table {
	font-size : 0.8em;
	border: 1px solid #DDF;
	border-width: 0px 2px;
}
td {
	border: 1px solid #EEF;
	border-width: 0px 0px 1px 0px;
	padding: 2px;
	vertical-align: middle;
}
tr {
	background-color: #FCFCFF;
}
.td_head {
	width: 1em;
	paddin-right : 0.5em;
}
.td_head_element {
	text-align: right;
}
.td_image {}
.td_change {
	width: 2em;
	text-align: center;
}
.td_name {
	width: 9em;
}
.td_none {}
.rank_notes {
	text-indent: 1em;
}
.tr_head {
	background-color: #DDF;
}
span.rankChange {
	font-size	: 0.8em;
}
span.title {
	font-size: 0.8em;
	font-weight: bold;
	margin-left: 1em;
}

コメントをどうぞ