質問するログイン新規登録

回答編集履歴

2

関数を改良

2017/10/06 06:11

投稿

miyabi-sun
miyabi-sun

スコア21542

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 array_count_by ($fn, $arr) {
42
+ function array_count_by_kokugo ($arr) {
43
43
  $results = [];
44
44
  foreach ($arr as $it) {
45
- $key = $fn($it);
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
- usort($a, 'cmp');
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 (array_count_by('get_kokugo', $a) as $point => $users) {
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

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

2017/10/06 06:11

投稿

miyabi-sun
miyabi-sun

スコア21542

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
  ```