B: 8
E: 7
A: 6
C: 0
D: 0
F: 0
問題7:連想配列を操作しよう
テストの平均点の高い順に画面に表示しよう
あらかじめエディタに書くコード
$list[] = ['name' => 'A', 'test' => [10, 3, 5]];
$list[] = ['name' => 'B', 'test' => [7, 9]];
$list[] = ['name' => 'C', 'test' => []];
$list[] = ['name' => 'D', 'test' => ""];
$list[] = ['name' => 'E', 'test' => [7]];
$list[] = ['name' => 'F', 'hoge' => []];
¥PHP¥
期待する画面
解答ソースコード
$list[] = ['name' => 'A', 'test' => [10, 3, 5]];
$list[] = ['name' => 'B', 'test' => [7, 9]];
$list[] = ['name' => 'C', 'test' => []];
$list[] = ['name' => 'D', 'test' => ""];
$list[] = ['name' => 'E', 'test' => [7]];
$list[] = ['name' => 'F', 'hoge' => []];
for ($i = 0; $i < count($list); $i++) {
$item = $list[$i];
$total = 0;
$count = 0;
if (isset($item['test']) && is_array($item['test'])) {
foreach ($item['test'] as $point) {
$total += $point;
$count++;
}
}
if ($count) {
$list[$i]["average"] = $total / $count;
} else {
$list[$i]["average"] = 0;
}
}
usort($list, function($a, $b) {
return $b["average"] - $a["average"];
});
foreach ($list as $item) {
echo "{$item["name"]}: {$item["average"]}<br>\n";
}
¥PHP¥
完了にする!
活動記録をTweetする
1.PHPについての説明と表示
今回の課題はtestが存在しないケース、配列ではないケースがある。
issetやis_array等を駆使して処理できるデータ形式になっているか確認しよう。
PHPを含む大部分のプログラム言語では0除算はエラーとなる。
除算する場合は0で割らないように注意しよう。
連想配列は自由にキーの付け外しが可能となっている。
ここでは平均点を格納して後の処理につなげるようにしている。
usortにソートロジックを実装した関数を渡そう。
コールバック関数でソートの基準値を返却するとリストを並び替えてくれるぞ。
今回はコールバック関数ではなくクロージャ(無名関数)を利用した。
一部の関数では必須なので覚えておこう。