思うようになったのである。

“ボウリングの紆余曲折”の“2投目の分析”が一応完成した。

見てくれはまだ悪く、表示の仕方に関してはこれから色々工夫する必要があるが、“やりたいこと”は実現できた。

“やりたいこと”優先で作業をしたためphpのコードはかなり冗長になってしまっている。もう少しすっきりとさせることができるように思うが、まあ今はいいとしよう。

今後は、jQweryのお力もお借りしながら、“見た目”をもう少しきれいに仕上げていくことにしよう。

今回このページを作成するにあたり、勉強になったことが一つ。

多次元配列を、(ほぼ)自在にソートできるarray_multisort()関数である。

php.net -array_multisort
http://php.net/manual/ja/function.array-multisort.php

array_multisort() は、複数の配列を一度に、 または、多次元の配列をその次元の一つでソートする際に使用可能です。 この関数は、ソートの際にキーの相関を維持します。

連想配列のキー (string) は不変ですが、 数値添字は再度振り直されます。

「ほぼ」自在にソートできる、と書いたのは、“数値添字は再度振り直され”てしまうこと。

つまり、例えば添字(キー)にピン番号をそのまま1,2,3…と付けている場合、ソートした結果0からのキーに振り直されてしまうため、この場合だとあらかじめキーにpin_1,pin_2,pin_3…と“string”の文字を格納しておかなければならない。

この点さえ注意していれば、非常に便利な関数である。

ボクの場合は、以下のような配列のソートに使用した。

$second['pin_1'] = array('csv' => '6', 'count' => '2');
$second['pin_2'] = array('csv' => '10,6', 'count '=> '4');
$second['pin_3'] = array('csv' => '10,6,4', 'count' => '1');

上記のような配列をcountというキーでソートしたい場合、以下のように記述する。

$sort_count = array();
// 並び替えの基準となるカラムを配列に格納
foreach($second as $key => $val){
  $sort_count[] = $val['count'];
}
// countでソート($secondが$sort_countの降順に並び変わる)
array_multisort($sort_count, SORT_DESC, SORT_NUMERIC, $second);

最初にforeach()文で“並び替えの基準となるカラムを配列に格納”しなければならないのがちょっと面倒臭いが、これをarray_multisort()の第4引数に使用する。

第2、第3引数は省略可能なオプションだが、第2引数では“降順”を、第3引数では“数値でソート”をそれぞれ指定している。

出力結果は、以下の通り。

Array
(
    [pin_2] => Array
        (
            [csv] => 10,6
            [count] => 4
        )
    [pin_1] => Array
        (
            [csv] => 6
            [count] => 2
        )
    [pin_3] => Array
        (
            [csv] => 10,6,4
            [count] => 1
        )
)

まあ、こんなカンジで“2投目の分析”のページが完成しましたとさ。

良かったら、見たってください。

http://www.nonukes-maria.net/bowling/analysis/second.php

ほな、寝ます。