選択と並べ替えをして表にする

3年データをソート

元のデータは前と同じ 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>

key,valとksort()を使った方法

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);の並べ替えがデータを文字列として扱っている為です。

2E2梅村千草うめむらちぐさ 3A1
2E11諏訪亜由香すわあゆか 3A10
2D11相馬美和そうまみわ 3A11
2D12竹浪千秋たけなみちあき 3A12
2A14鳴海麻美なるみあさみ 3A13
2F14野呂春菜のろはるな 3A14
2C16福田初美ふくだはつみ 3A15
2A15蒔苗菜摘まかなえなつみ 3A16
2H16山内志保やまうちしほ 3A17
2C18幸田奈々子ゆきたななこ 3A18
2D19浅利和哉あさりかずや 3A19
2A3岡本おかもとあい 3A2
2D21石川和茂いしかわかずしげ 3A20
2B20一戸いちのへさとし 3A21
.... ..................

これは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年のクラス名が先に表示されるようにしなさい。