「$update」を作りたいです。
###実現したいこと
下記の「$new」を使って、「$current」から値を削除して、「$update」を作りたいです。
しかしそのルールがかなり複雑で、しかも特にエラーも出ないためにダメな部分がわかりません。
文末に自分なりのコードをイメージで書いたので、ダメな部分が分かる方がいらっしゃいましたら正しいコードをご指南頂けませんでしょうか。
###「$update」を作るルール
問題のルールは次のようなものです。
「$current」の「'action'の値」に、「$new」の「'action'の値」と同じ値があるときに、「'id'の値」にも同じものがあれば、「$current」に以下➀➁が削除される
➀その同じ「'id'の値」を削除する。
➁削除した「'id'の値」と同じ位置にある「'time'の値」も削除する。
以下、配列とコードになります。
###「$new」
こちらが「$new」です。全ての値は常に1つずつです。
php
1$new = array( 2 '2019-01-02'=> array( 3 array( 4 'action'=>'greeting', 5 'id'=>array('7'), 6 'time'=>array('2019-01-03 07:00'), 7 ), 8 ), 9);
###「$current」
こちらが「$current」です。数は不明ですが、同じ日付に同じアクションは重複しません。
コメントアウトさせてあるような➀➁の削除を実現させたいと考えています。
php
1$current = array( 2 '2019-01-02'=> array( 3 array( 4 'action'=>'attack', 5 'id'=>array('3','7'), 6 'time'=>array('2019-01-02 21:00','2019-01-01 03:00'), 7 ), 8 ), 9 '2019-01-01'=> array( 10 array( 11 'action'=>'greeting', // 'action' の値が $new と同じなので、この配列に下記➀➁の変化を加える 12 'id'=>array('6','7'), // ➀ まず '7' を削除して、それが2番目であることを記憶しておく 13 'time'=>array('2019-01-01 15:00','2019-01-01 02:00'), // ➁ 2番目にある '2019-01-01 02:00' を削除する 14 ), 15 ), 16);
###試しているコード
こちらのコードが現在考えているものですが、エラーは出ず、しかし削除もされません。
php
1foreach($new as $day => $contents) { 2 foreach($contents as $content) { 3 for($i = 0; $i < count($current[$day]); $i++) { 4 // 'action' が同じ場合 5 if($current[$day][$i]['action'] !== $content['action']) { 6 // 'id' が同じ場合 7 if ( in_array($content['id'], $current[$day][$i]['id']) ) { 8 // 同じ 'id'を $current から削除 9 while( ($index = array_search( $content['id'], $current[$day][$i]['id'], true )) !== false ) { 10 unset( $array[$index] ) ; 11 } 12 // 削除した 'id' と同じ位置の'time'を削除 13 $position = array_search($content['id'], $current[$day][$i]['id']); // 削除した 'id' の位置を取得 14 unset($current[$day][$i]['time'][$position]); // その位置の 'time' を削除 15 } 16 } 17 } 18 } 19} 20$update = $current; 21var_export($update);
###「$update」
最後に実現したい「$update」を掲載しておきます。コメントアウトしてある2点が望む変化です。
php
1$current = array( 2 '2019-01-02'=> array( 3 array( 4 'action'=>'attack', 5 'id'=>array('3','7'), 6 'time'=>array('2019-01-02 21:00','2019-01-01 03:00'), 7 ), 8 ), 9 '2019-01-01'=> array( 10 array( 11 'action'=>'greeting', 12 'id'=>array('6'), // 削除されてる 13 'time'=>array('2019-01-01 15:00') //削除されてる 14 ), 15 ), 16);
以上です。長々と申し訳ございませんが、ご査収頂ければ幸いです。
何卒宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー