元のデータは前と同じ 2to3nen.txt です。3年のクラスを選んだ時に番号順に並べ替えるようにします。
3年の選択ボタンの部分はselect2.phpと同じですが、今回はselect3.phpというページにするのでactionの先も忘れずにselect3.phpに直します。その他は同じ。
<form action="select3.php#koko" method="post" id="koko"> <p> <button name="hr" value="2A">2A</button> <button name="hr" value="2B">2B</button> <button name="hr" value="2C">2C</button> <button name="hr" value="2D">2D</button> <button name="hr" value="2E">2E</button> <button name="hr" value="2F">2F</button> <button name="hr" value="2G">2G</button> <button name="hr" value="2H">2H</button> </p> <p> <button name="newhr" value="3A">3A</button> <button name="newhr" value="3B">3B</button> <button name="newhr" value="3C">3C</button> <button name="newhr" value="3D">3D</button> <button name="newhr" value="3E">3E</button> <button name="newhr" value="3F">3F</button> <button name="newhr" value="3G">3G</button> <button name="newhr" value="3H">3H</button> </p> </form>
PHPプログラムはこちら。
まず、3年の時だけソートが必要なので、newhrに値が入っているかhrに値が入っているかで作業を分けます。 isset($_POST["hr"]) が hr に値が入っているかどうか調べる関数です。
newhrに値が入っているときには、sort.php でやった手法で、key,valを登録しています。今回のkeyはnewnoです。newhrで先に該当するデータだけに絞っているのがif ($newhr === $snewhr){の部分です。newhrで絞っているのでnewnoだけで順番が決まります。
$fp = fopen("2to3nen.txt","r"); $shr="2Z"; if( isset($_POST["hr"]) ){ $shr =$_POST["hr"]; while(!feof($fp)){ $line = fgets($fp); if (trim($line) != null){ list($hr,$no,$sei,$mei,$seib,$ysei,$ymei,$newhr,$newno) = explode("\t",$line); if ($hr === $shr){ print "<tr>\n"; print "<td>$hr</td><td>$no</td><td>$sei</td><td>$mei</td>"; print "<td>$seib</td><td>$ysei</td><td>$ymei</td>\n"; print "<td>$newhr</td><td>$newno</td>\n"; print "</tr>\n"; } } } } $snewhr="3Z"; if( isset($_POST["newhr"]) ){ $snewhr =$_POST["newhr"]; while(!feof($fp)){ $line = fgets($fp); if (trim($line) != null){ list($hr,$no,$sei,$mei,$seib,$ysei,$ymei,$newhr,$newno) = explode("\t",$line); if ($newhr === $snewhr){ $key = $newno; $val = $line; $gotoarray[$key]=$val; } } } ksort($gotoarray); foreach ($gotoarray as $key => $val) { list($hr,$no,$sei,$mei,$seib,$ysei,$ymei,$newhr,$newno) = explode("\t",$val); print "<tr>\n"; print "<td>$hr</td><td>$no</td><td>$sei</td><td>$mei</td>"; print "<td>$seib</td><td>$ysei</td><td>$ymei</td>\n"; print "<td>$newhr</td><td>$newno</td>\n"; print "</tr>\n"; } } fclose($fp);
残念ながら、上記のソートでは次のようになります。
これはksort($gotoarray);の並べ替えがデータを文字列として扱っている為です。
2E | 2 | 梅村 | 千草 | 女 | うめむら | ちぐさ | 3A | 1 |
2E | 11 | 諏訪 | 亜由香 | 女 | すわ | あゆか | 3A | 10 |
2D | 11 | 相馬 | 美和 | 女 | そうま | みわ | 3A | 11 |
2D | 12 | 竹浪 | 千秋 | 女 | たけなみ | ちあき | 3A | 12 |
2A | 14 | 鳴海 | 麻美 | 女 | なるみ | あさみ | 3A | 13 |
2F | 14 | 野呂 | 春菜 | 女 | のろ | はるな | 3A | 14 |
2C | 16 | 福田 | 初美 | 女 | ふくだ | はつみ | 3A | 15 |
2A | 15 | 蒔苗 | 菜摘 | 女 | まかなえ | なつみ | 3A | 16 |
2H | 16 | 山内 | 志保 | 女 | やまうち | しほ | 3A | 17 |
2C | 18 | 幸田 | 奈々子 | 女 | ゆきた | ななこ | 3A | 18 |
2D | 19 | 浅利 | 和哉 | 男 | あさり | かずや | 3A | 19 |
2A | 3 | 岡本 | 愛 | 女 | おかもと | あい | 3A | 2 |
2D | 21 | 石川 | 和茂 | 男 | いしかわ | かずしげ | 3A | 20 |
2B | 20 | 一戸 | 聡 | 男 | いちのへ | さとし | 3A | 21 |
.. | .. | .............. | .. | .. |
これはksortにSORT_NUMERICの指示を加えることで回避できます。ksort($gotoarray)をksort($gotoarray,SORT_NUMERIC)にしてください。
select2.phpと同じように、3年のクラスと番号を行の先頭に表示させるのは簡単です。print "<td>$hr</td><td>$no</td>...の部分を変更するだけです。
上の説明は前回の課題2の解答になっています。
前回の課題2 select3.php を完成させなさい。index.htmlに「phpで選択3」という名前のリンクを作りましたか。
コピーするだけでは、数値の順番がおかしくなります。上の説明を参考に SORT_NUMERIC を指定して直します。
select2.phpと同じように、3年を選んだ時には3年のクラス名が先に表示されるようにしなさい。