回答編集履歴

2

関数を改良

2017/10/06 06:11

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -70,9 +70,9 @@
70
70
 
71
71
  「追記」
72
72
 
73
- ユーザー的な情報を用いて出力できるよう修正してた。
73
+ ユーザー的な情報を用いて出力できるよう修正してた
74
74
 
75
- ーん、あんまり美しくないかも?
75
+ この手法を使えば小数点等でも対応出来ると思よ。
76
76
 
77
77
 
78
78
 
@@ -80,13 +80,13 @@
80
80
 
81
81
  <?php
82
82
 
83
- function array_count_by ($fn, $arr) {
83
+ function array_count_by_kokugo ($arr) {
84
84
 
85
85
  $results = [];
86
86
 
87
87
  foreach ($arr as $it) {
88
88
 
89
- $key = $fn($it);
89
+ $key = (string)$it['kokugo'];
90
90
 
91
91
  if (!isset($results[$key])) $results[$key] = [];
92
92
 
@@ -95,24 +95,6 @@
95
95
  }
96
96
 
97
97
  return $results;
98
-
99
- }
100
-
101
- function get_kokugo ($it) {
102
-
103
- return (string)$it['kokugo'];
104
-
105
- }
106
-
107
- function cmp ($a, $b) {
108
-
109
- $a2 = (float)get_kokugo($a);
110
-
111
- $b2 = (float)get_kokugo($b);
112
-
113
- if ($a2 == $b2) return 0;
114
-
115
- return ($a2 < $b2) ? 1 : -1;
116
98
 
117
99
  }
118
100
 
@@ -140,13 +122,23 @@
140
122
 
141
123
  ];
142
124
 
125
+ usort($a, function ($a, $b) {
126
+
143
- usort($a, 'cmp');
127
+ $a2 = $a['kokugo'];
128
+
129
+ $b2 = $b['kokugo'];
130
+
131
+ if ($a2 == $b2) return 0;
132
+
133
+ return ($a2 < $b2) ? 1 : -1;
134
+
135
+ });
144
136
 
145
137
 
146
138
 
147
139
  $rank = 1;
148
140
 
149
- foreach (array_count_by('get_kokugo', $a) as $point => $users) {
141
+ foreach (array_count_by_kokugo($a) as $point => $users) {
150
142
 
151
143
  foreach ($users as $user) {
152
144
 
@@ -157,6 +149,8 @@
157
149
  $rank += count($users);
158
150
 
159
151
  }
152
+
153
+
160
154
 
161
155
  ?>
162
156
 

1

追記、様々なケースに耐えられるよう改造

2017/10/06 06:11

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -61,3 +61,123 @@
61
61
  9位: 85
62
62
 
63
63
  ```
64
+
65
+
66
+
67
+ ---
68
+
69
+
70
+
71
+ 「追記」
72
+
73
+ ユーザー的な情報を用いて出力できるよう修正してみた。
74
+
75
+ うーん、あんまり美しくないかも?
76
+
77
+
78
+
79
+ ```PHP
80
+
81
+ <?php
82
+
83
+ function array_count_by ($fn, $arr) {
84
+
85
+ $results = [];
86
+
87
+ foreach ($arr as $it) {
88
+
89
+ $key = $fn($it);
90
+
91
+ if (!isset($results[$key])) $results[$key] = [];
92
+
93
+ $results[$key][] = $it;
94
+
95
+ }
96
+
97
+ return $results;
98
+
99
+ }
100
+
101
+ function get_kokugo ($it) {
102
+
103
+ return (string)$it['kokugo'];
104
+
105
+ }
106
+
107
+ function cmp ($a, $b) {
108
+
109
+ $a2 = (float)get_kokugo($a);
110
+
111
+ $b2 = (float)get_kokugo($b);
112
+
113
+ if ($a2 == $b2) return 0;
114
+
115
+ return ($a2 < $b2) ? 1 : -1;
116
+
117
+ }
118
+
119
+
120
+
121
+ $a = [
122
+
123
+ ["name" => "a", "kokugo" => 80.5],
124
+
125
+ ["name" => "b", "kokugo" => 100],
126
+
127
+ ["name" => "c", "kokugo" => 81],
128
+
129
+ ["name" => "d", "kokugo" => 100],
130
+
131
+ ["name" => "e", "kokugo" => 90.5],
132
+
133
+ ["name" => "f", "kokugo" => 90.5],
134
+
135
+ ["name" => "g", "kokugo" => 90.5],
136
+
137
+ ["name" => "h", "kokugo" => 87.5],
138
+
139
+ ["name" => "g", "kokugo" => 80],
140
+
141
+ ];
142
+
143
+ usort($a, 'cmp');
144
+
145
+
146
+
147
+ $rank = 1;
148
+
149
+ foreach (array_count_by('get_kokugo', $a) as $point => $users) {
150
+
151
+ foreach ($users as $user) {
152
+
153
+ echo "{$rank}位: {$user['name']} ({$point})\n";
154
+
155
+ }
156
+
157
+ $rank += count($users);
158
+
159
+ }
160
+
161
+ ?>
162
+
163
+
164
+
165
+ 1位: d (100)
166
+
167
+ 1位: b (100)
168
+
169
+ 3位: f (90.5)
170
+
171
+ 3位: g (90.5)
172
+
173
+ 3位: e (90.5)
174
+
175
+ 6位: h (87.5)
176
+
177
+ 7位: c (81)
178
+
179
+ 8位: a (80.5)
180
+
181
+ 9位: g (80)
182
+
183
+ ```