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

回答編集履歴

4

補足

2020/02/25 04:24

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -70,4 +70,30 @@
70
70
  [PHPマニュアル array_multisort](https://www.php.net/manual/ja/function.array-multisort.php)
71
71
  [PHPの多次元連想配列のソート](https://qiita.com/shy_azusa/items/54dadc55e3e71cde1445)
72
72
 
73
- を参考にソートして、ソート後の配列を必要な数だけ取り出す という感じで実装できるかと思います。
73
+ を参考にソートして、ソート後の配列を必要な数だけ取り出す という感じで実装できるかと思います。
74
+
75
+
76
+ データの持ち方を変えればもっと楽な例
77
+ ---
78
+ ```PHP
79
+ <?php
80
+
81
+ //元のデータがこんな感じであるとして
82
+ $arr = [
83
+ ['val'=>'a1','date'=>'2020-02-25 01:00:00'],
84
+ ['val'=>'a2','date'=>'2020-02-25 02:00:00'],
85
+ ['val'=>'a3','date'=>'2020-02-25 03:00:00']
86
+ ];
87
+
88
+ foreach($arr as $row){
89
+ $newArr[$row['val']] = $row;
90
+ }
91
+
92
+ $new = ['val'=>'a4','date'=>'2020-02-25 04:00:00'];
93
+
94
+ //データが無いときは追加であるときは更新
95
+ $newArr[$new['val']] = $new;
96
+
97
+
98
+ var_dump($newArr);
99
+ ```

3

追記

2020/02/25 04:24

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -12,17 +12,25 @@
12
12
  ['val'=>'a3','date'=>'2020-02-25 03:00:00']
13
13
  ];
14
14
 
15
- $new = ['val'=>'a2','date'=>'2020-02-25 04:00:00'];
15
+ $new = ['val'=>'a4','date'=>'2020-02-25 04:00:00'];
16
+
17
+ $isInArray = false;
16
18
  foreach($arr as $key => $row ){
17
19
  if($row['val'] === $new['val']){
18
20
  $arr[$key]['date'] = $new['date'];
21
+ $isInArray = true;
19
22
  }
20
23
  }
21
24
 
25
+ if($isInArray === false){
26
+ $arr[] = $new;
27
+ }
28
+
22
29
  var_dump($arr);
23
30
 
31
+
24
32
  /*
25
- array(3) {
33
+ array(4) {
26
34
  [0] =>
27
35
  array(2) {
28
36
  'val' =>
@@ -35,7 +43,7 @@
35
43
  'val' =>
36
44
  string(2) "a2"
37
45
  'date' =>
38
- string(19) "2020-02-25 04:00:00"
46
+ string(19) "2020-02-25 02:00:00"
39
47
  }
40
48
  [2] =>
41
49
  array(2) {
@@ -44,6 +52,13 @@
44
52
  'date' =>
45
53
  string(19) "2020-02-25 03:00:00"
46
54
  }
55
+ [3] =>
56
+ array(2) {
57
+ 'val' =>
58
+ string(2) "a4"
59
+ 'date' =>
60
+ string(19) "2020-02-25 04:00:00"
61
+ }
47
62
  }
48
63
  */
49
64
 

2

エラー修正

2020/02/25 03:53

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -5,19 +5,17 @@
5
5
 
6
6
  ```PHP
7
7
 
8
+
8
9
  $arr = [
9
10
  ['val'=>'a1','date'=>'2020-02-25 01:00:00'],
10
11
  ['val'=>'a2','date'=>'2020-02-25 02:00:00'],
11
12
  ['val'=>'a3','date'=>'2020-02-25 03:00:00']
12
13
  ];
13
14
 
14
- $new = ['val'=>'a2','date'=>'2020-02-25 04:00:00'];
15
+ $new = ['val'=>'a2','date'=>'2020-02-25 04:00:00'];
15
-
16
- foreach($new as $newRow){
17
- foreach($arr as $key => $row ){
16
+ foreach($arr as $key => $row ){
18
- if($row['val'] === $newRow['val']){
17
+ if($row['val'] === $new['val']){
19
- $arr[$key]['date'] = $newRow['date'];
18
+ $arr[$key]['date'] = $new['date'];
20
- }
21
19
  }
22
20
  }
23
21
 
@@ -37,7 +35,7 @@
37
35
  'val' =>
38
36
  string(2) "a2"
39
37
  'date' =>
40
- string(19) "2020-02-25 02:00:00"
38
+ string(19) "2020-02-25 04:00:00"
41
39
  }
42
40
  [2] =>
43
41
  array(2) {
@@ -47,7 +45,6 @@
47
45
  string(19) "2020-02-25 03:00:00"
48
46
  }
49
47
  }
50
-
51
48
  */
52
49
 
53
50
  ```

1

補足

2020/02/25 03:38

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  > 1.$arrと$newを比較し、valが同じ値ならdateを更新したい。
2
2
 
3
3
  冗長な感じはありますが、愚直にやるならこうかなあ。
4
- ポイントとしては`$arr`を直接いじりたいなら`$arr[$key][`date`]`みたいにする必要がある点
4
+ ポイントとしては`$arr`を直接いじりたいなら`$arr[$key]['date']`みたいにする必要がある点です。(これを`$row['date'] = $newRow['date']`としても`$arr`は書き換わりません。)
5
5
 
6
6
  ```PHP
7
7