実現したいこと
下記の「新しい配列 $new
」と「現在の配列 $current
」を、「目的の配列 $update
」にすることが目的です。
文末のソースコードまで漕ぎつけたのですが配列操作が初心者すぎて歯が立たず、質問させて頂きました。
どなたか適切な書き方を教えて頂けませんでしょうか。
###詳しい操作
その配列操作としては、まず
➀$new
と日付が同じ$current
の中から、'action'=>'apple'
の配列を合体し、一番上に移動する。
という操作があり、そしてこの合体にあたって、
➀'time'
を連結する。(20件まで)
➁'actorID'
を連結する。(20件まで)
➂'allow'
を'undone'
にする。
という計4つの操作があります。
「新しい配列 $new」と「現在の配列 $current」
下記2つの配列が操作対象です。
/* * 新しい配列 $new */ $new = array( '2019-01-02'=> array( array( 'action'=>'apple', 'time'=>'2019-01-02 17:00:00.000', 'targetID'=>'1', 'actorID'=>'17', 'allow'=>'undone', ) ) ); /* * 現在の配列 $current */ $current = array( '2019-01-02'=> array( array( 'action'=>'orange', 'time'=>array('2019-01-02 16:00:00.000','2019-01-01 15:00:00.000'), 'targetID'=>'200', 'authorID'=>'1', 'actorID'=>array('16','15'), 'allow'=>'undone', ), array( 'action'=>'apple', 'time'=>array('2019-01-02 14:00:00.000','2019-01-01 13:00:00.000'), 'targetID'=>'1', 'actorID'=>array('14','13'), 'allow'=>'done', ), ), '2019-01-01'=> array( array( 'action'=>'apple', 'time'=>array('2019-01-01 04:00:00.000','2019-01-01 03:00:00.000'), 'targetID'=>'1', 'actorID'=>array('4','3'), 'allow'=>'done', ), ), );
目的の配列
上の2つの配列について、➀➁➂➃の操作によって作りたい配列が下記になります。
/* * 目的の配列 $update */ $update = array( '2019-01-02'=> array( array( // 日付が同じappleなので➀➁➂➃をする 'action'=>'apple', 'time'=>array('2019-01-02 17:00:00.000,2019-01-02 14:00:00.000','2019-01-01 13:00:00.000'), 'targetID'=>'1', 'actorID'=>array('17','14','13'), 'allow'=>'undone', ), array( // 日付が同じだけどappleではないので変化なし 'action'=>'orange', 'time'=>array('2019-01-02 16:00:00.000','2019-01-01 15:00:00.000'), 'targetID'=>'200', 'authorID'=>'1', 'actorID'=>array('16','15'), 'allow'=>'undone', ), ), '2019-01-01'=> array( array( // 日付が違うので変化なし 'action'=>'apple', 'time'=>array('2019-01-01 04:00:00.000','2019-01-01 03:00:00.000'), 'targetID'=>'1', 'actorID'=>array('4','3'), 'allow'=>'done', ), ), );
試したこと
➀➁➂➃の操作のために書いたソースコードがこちらです。正直自信がまったくないのですが、せめてイメージが伝わればと思い、お恥ずかしながら掲載させて頂きます。
php
1/* 2* 目的の配列を作る 3* usage: $update = mymerge($new, $current); 4*/ 5function mymerge($arg1, $arg2) { 6 foreach ($arg1 as $item) { 7 $newdate = $item[0]; // 新しい配列の日付を取得 8 // appleの連結 9 if ($item['action'] === 'apple') { 10 foreach ($arg2 as $key=>$val) { 11 // appleで日付が同じなら連結 12 if ($val['action'] === 'apple' && $val[0] === $newdate ) { 13 array_unshift($arg2[$key]['time'], $item['time']);// timeを連結 14 array_unshift($arg2[$key]['actorID'], $item['actorID']);// actorIDを連結 15 $arg2[$key]['allow'] = 'undone'; // 未許可にする 16 while (count($arg2[$key]['actorID']) > 20) { array_pop($arg2[$key]['actorID']); } // 20件以降は追加しない 17 $add_apple = true; 18 break; 19 } 20 } 21 if ($add_apple) { continue; } 22 } 23 array_unshift($arg2, $item); 24 } 25 return($arg2); 26} 27$update = mymerge( $add, $current );
回答2件
あなたの回答
tips
プレビュー