###実現したいこと
1.$arr
と$new
を比較し、val
が同じ値ならdate
を更新し、同じ値でなければ追加したい。
2.$arr
は最大4件までとしたい。
宜しくお願い致します。
###該当のソースコード
まず元からある配列として$arr
があります。
PHP
1$arr = [ 2 ['val'=>'a1','date'=>'2020-02-25 01:00:00'], 3 ['val'=>'a2','date'=>'2020-02-25 02:00:00'], 4 ['val'=>'a3','date'=>'2020-02-25 03:00:00'] 5];
次の$new
が与えられた場合、val
と同じ値が$arr
にあるので、そのdate
を更新して$result1
を得るのが目的です。
PHP
1$new = ['val'=>'a2','date'=>'2020-02-25 04:00:00']; 2 3$result1 = [ 4 ['val'=>'a1','date'=>'2020-02-25 01:00:00'], 5 ['val'=>'a2','date'=>'2020-02-25 04:00:00'], // valが同じ値なのでdateを更新 6 ['val'=>'a3','date'=>'2020-02-25 03:00:00'] 7];
もし$newが次の場合、$arrに同じ値がないので、普通に追加して以下$result2を得たいです。
PHP
1$new = ['val'=>'a4','date'=>'2020-02-25 04:00:00']; 2 3$result2 = [ 4 ['val'=>'a1','date'=>'2020-02-25 01:00:00'], 5 ['val'=>'a2','date'=>'2020-02-25 02:00:00'], 6 ['val'=>'a3','date'=>'2020-02-25 03:00:00'], 7 ['val'=>'a4','date'=>'2020-02-25 04:00:00'] // 普通に追加 8];
ここまでは1の処理です。もしできれば2の処理として最新の4件までとし、古いものは削除したいのですが、これは文末に「2のロジック」として追記させて頂きました。(あちこち飛んで申し訳ございません。)
###発生している問題(1について)
まず1についてです。
1.
$arr
と$new
を比較し、val
が同じ値ならdate
を更新したい。
foreach
で試したのですが、これでは配列が増えすぎてしまいました。
原因はif
の分岐で、同じ値があってもなくても該当して追加されてしまうからでしょうか?
PHP
1// 同じ値があればその日付を更新し、なければ追加 2foreach ( $arr as &$ar ) { 3 if ( $ar['val'] == $new['val'] ) { 4 $ar['date'] = $new['date']; 5 } else { 6 $arr[] = $new; 7 } 8} 9var_dump($arr);
###試したこと(1について)
上のif
がおかしいなら、更新と追加の処理を次のようにして分けたらどうかと思いましたが、これでもやはり余計な配列が増えてしまいます。
PHP
1// $newのvalと同じ値があればその日付を更新し、 2foreach ( $arr as &$ar ) { 3 if ( $ar['val'] == $new['val'] ) { 4 $ar['date'] = $new['date']; break; 5 } 6} 7// なければ追加 8foreach ( $arr as $ar ) { 9 if ( $ar['val'] != $new['val'] ) { 10 $arr[] = $new; break; 11 } 12} 13var_dump($arr);
###発生している問題(2について)
そして2についてです
2.
$arr
は最大4件までとしたい。
これは次のコードしかわからずコメントアウトしてあるようなエラーになります。
「array_keys
に渡せるのは配列だけ」というエラーかと思うのですが、でも最大値を見たいのはdate
だけなので$arr['date']
とする以外にどうしたらいいのかわからず、とりあえずエラーのままのコードですみませんが掲載させて頂きました。
PHP
1// 4件以上なら古いdateのものを削除 2if ( count($arr) >= 4 ) { 3 $maxes = array_keys($arr['date'], max($arr['date'])); 4 $max = $maxes[0]; 5 unset($arr[$max]); 6} 7var_dump($arr); 8 9/* 10エラーメッセージ 11PHP Notice: Undefined index: date in /aaa/bbb.php on line 0 12PHP Notice: Undefined index: date in /aaa/bbb.php on line 0 13PHP Warning: max(): When only one parameter is given, it must be an array in /aaa/bbb.php on line 0 14PHP Warning: array_keys() expects parameter 1 to be array, null given in /aaa/bbb.php on line 0 15*/
###試したこと(2について)
すみません、最大値を得る方法が上の書き方しかわからず、他に試すことが思い浮かびませんでした。
###バージョン
PHP 7.2.13 です。
###2のロジック
2のロジックについてご説明させて頂きます。
以下の場合$new
のval
は$arr
のどれとも一致しないので、1を介して$arr
に普通に追加されることになり$result2
がまず得られます。
しかしその結果5件になるので、その5件から古いものを削除し$result3
を得たいということを考えています。これが2の処理です。
(自分がわかりやすいので1と2の処理に分けていますが、欲しいのは$result3
だけで、その過程にある$result1
や$result2
の方は不要です。)
PHP
1$arr = [ 2 ['val'=>'a1','date'=>'2020-02-25 01:00:00'], 3 ['val'=>'a2','date'=>'2020-02-25 02:00:00'], 4 ['val'=>'a3','date'=>'2020-02-25 03:00:00'], 5 ['val'=>'a4','date'=>'2020-02-25 04:00:00'] 6]; 7 8$new = ['val'=>'a5','date'=>'2020-02-25 05:00:00']; 9 10// ↓ 1の処理で$result2が得られる 11 12$result2 = [ 13 ['val'=>'a1','date'=>'2020-02-25 01:00:00'], 14 ['val'=>'a2','date'=>'2020-02-25 02:00:00'], 15 ['val'=>'a3','date'=>'2020-02-25 03:00:00'], 16 ['val'=>'a4','date'=>'2020-02-25 04:00:00'], 17 ['val'=>'a5','date'=>'2020-02-25 05:00:00'] 18]; 19 20// ↓ 2の処理で古いものを削除し以下$result3を得たい 21 22$result3 = [ 23 ['val'=>'a2','date'=>'2020-02-25 02:00:00'], 24 ['val'=>'a3','date'=>'2020-02-25 03:00:00'], 25 ['val'=>'a4','date'=>'2020-02-25 04:00:00'], 26 ['val'=>'a5','date'=>'2020-02-25 05:00:00'] 27]; 28
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/25 03:30
2020/02/25 03:31
2020/02/25 03:31
2020/02/25 03:39
2020/02/25 03:43
2020/02/25 03:46 編集
2020/02/25 03:46
2020/02/25 03:55
2020/02/25 04:00
2020/02/25 04:20
2020/02/25 04:23
2020/02/25 04:26
2020/02/25 04:27
2020/02/25 04:30
2020/02/25 04:31
2020/02/25 04:32
2020/02/25 04:33
2020/02/25 04:33
2020/02/25 04:34