回答編集履歴
2
関数を改良
answer
CHANGED
@@ -34,29 +34,20 @@
|
|
34
34
|
---
|
35
35
|
|
36
36
|
「追記」
|
37
|
-
ユーザー的な情報を用いて出力できるよう修正して
|
37
|
+
ユーザー的な情報を用いて出力できるよう修正してたよ。
|
38
|
-
|
38
|
+
この手法を使えば小数点等でも対応出来ると思うよ。
|
39
39
|
|
40
40
|
```PHP
|
41
41
|
<?php
|
42
|
-
function
|
42
|
+
function array_count_by_kokugo ($arr) {
|
43
43
|
$results = [];
|
44
44
|
foreach ($arr as $it) {
|
45
|
-
$key =
|
45
|
+
$key = (string)$it['kokugo'];
|
46
46
|
if (!isset($results[$key])) $results[$key] = [];
|
47
47
|
$results[$key][] = $it;
|
48
48
|
}
|
49
49
|
return $results;
|
50
50
|
}
|
51
|
-
function get_kokugo ($it) {
|
52
|
-
return (string)$it['kokugo'];
|
53
|
-
}
|
54
|
-
function cmp ($a, $b) {
|
55
|
-
$a2 = (float)get_kokugo($a);
|
56
|
-
$b2 = (float)get_kokugo($b);
|
57
|
-
if ($a2 == $b2) return 0;
|
58
|
-
return ($a2 < $b2) ? 1 : -1;
|
59
|
-
}
|
60
51
|
|
61
52
|
$a = [
|
62
53
|
["name" => "a", "kokugo" => 80.5],
|
@@ -69,15 +60,21 @@
|
|
69
60
|
["name" => "h", "kokugo" => 87.5],
|
70
61
|
["name" => "g", "kokugo" => 80],
|
71
62
|
];
|
63
|
+
usort($a, function ($a, $b) {
|
72
|
-
|
64
|
+
$a2 = $a['kokugo'];
|
65
|
+
$b2 = $b['kokugo'];
|
66
|
+
if ($a2 == $b2) return 0;
|
67
|
+
return ($a2 < $b2) ? 1 : -1;
|
68
|
+
});
|
73
69
|
|
74
70
|
$rank = 1;
|
75
|
-
foreach (
|
71
|
+
foreach (array_count_by_kokugo($a) as $point => $users) {
|
76
72
|
foreach ($users as $user) {
|
77
73
|
echo "{$rank}位: {$user['name']} ({$point})\n";
|
78
74
|
}
|
79
75
|
$rank += count($users);
|
80
76
|
}
|
77
|
+
|
81
78
|
?>
|
82
79
|
|
83
80
|
1位: d (100)
|
1
追記、様々なケースに耐えられるよう改造
answer
CHANGED
@@ -29,4 +29,64 @@
|
|
29
29
|
6位: 88
|
30
30
|
6位: 88
|
31
31
|
9位: 85
|
32
|
+
```
|
33
|
+
|
34
|
+
---
|
35
|
+
|
36
|
+
「追記」
|
37
|
+
ユーザー的な情報を用いて出力できるよう修正してみた。
|
38
|
+
うーん、あんまり美しくないかも?
|
39
|
+
|
40
|
+
```PHP
|
41
|
+
<?php
|
42
|
+
function array_count_by ($fn, $arr) {
|
43
|
+
$results = [];
|
44
|
+
foreach ($arr as $it) {
|
45
|
+
$key = $fn($it);
|
46
|
+
if (!isset($results[$key])) $results[$key] = [];
|
47
|
+
$results[$key][] = $it;
|
48
|
+
}
|
49
|
+
return $results;
|
50
|
+
}
|
51
|
+
function get_kokugo ($it) {
|
52
|
+
return (string)$it['kokugo'];
|
53
|
+
}
|
54
|
+
function cmp ($a, $b) {
|
55
|
+
$a2 = (float)get_kokugo($a);
|
56
|
+
$b2 = (float)get_kokugo($b);
|
57
|
+
if ($a2 == $b2) return 0;
|
58
|
+
return ($a2 < $b2) ? 1 : -1;
|
59
|
+
}
|
60
|
+
|
61
|
+
$a = [
|
62
|
+
["name" => "a", "kokugo" => 80.5],
|
63
|
+
["name" => "b", "kokugo" => 100],
|
64
|
+
["name" => "c", "kokugo" => 81],
|
65
|
+
["name" => "d", "kokugo" => 100],
|
66
|
+
["name" => "e", "kokugo" => 90.5],
|
67
|
+
["name" => "f", "kokugo" => 90.5],
|
68
|
+
["name" => "g", "kokugo" => 90.5],
|
69
|
+
["name" => "h", "kokugo" => 87.5],
|
70
|
+
["name" => "g", "kokugo" => 80],
|
71
|
+
];
|
72
|
+
usort($a, 'cmp');
|
73
|
+
|
74
|
+
$rank = 1;
|
75
|
+
foreach (array_count_by('get_kokugo', $a) as $point => $users) {
|
76
|
+
foreach ($users as $user) {
|
77
|
+
echo "{$rank}位: {$user['name']} ({$point})\n";
|
78
|
+
}
|
79
|
+
$rank += count($users);
|
80
|
+
}
|
81
|
+
?>
|
82
|
+
|
83
|
+
1位: d (100)
|
84
|
+
1位: b (100)
|
85
|
+
3位: f (90.5)
|
86
|
+
3位: g (90.5)
|
87
|
+
3位: e (90.5)
|
88
|
+
6位: h (87.5)
|
89
|
+
7位: c (81)
|
90
|
+
8位: a (80.5)
|
91
|
+
9位: g (80)
|
32
92
|
```
|