###実現したいこと
後述するソースコードで
「新しい配列 $new」を「現在の配列 $current」の上に連結させたいです。
しかし連結させる条件(同じactionがない場合のみ)が複雑で、歯が立ちません。
先にソースコードの実行サンプルがありますのでよろしけれはご覧ください。
http://codepad.org/5hJVItQb
###躓いている部分
それぞれの処理にコメントと番号がありますが、その2番目の、
//【処理2】同じactionがなければ、年月日の配列を連結して終了
ができない状況です。
この4行を削除したとき(つまり $new の action が $current の action と同じであるとき)は、問題なく作動致します。
同じ action がない場合の連結を実現したいです。
以下、それぞれの配列と、配列連結のために書かれたソースコードになります。
###新しい配列
こちらが新しく連結される配列 $new になります。
PHP
1/* 2* 新しい配列 $new 3*/ 4$new = array( 5 '2019-01-02'=> array( 6 array( 7 'action'=>'banana', 8 'time'=>'01-02', 9 'targetID'=>'1', 10 'actorID'=>'17', 11 'subID'=>'77', 12 ) 13 ) 14);
###現在の配列
こちらはすでにある配列 $current です。この 2019-01-02 の先頭に banana を連結させたい感じです。
PHP
1/* 2* 現在の配列 $current 3*/ 4$current = array( 5 '2019-01-02'=> array( 6 array( 7 'action'=>'orange', 8 'time'=>array('01-02','01-01'), 9 'targetID'=>'200', 10 'actorID'=>array('16','15'), 11 'subID'=>array('6','22'), 12 ), 13 array( 14 'action'=>'apple', 15 'time'=>array('01-02','01-01'), 16 'targetID'=>'1', 17 'actorID'=>array('14','13'), 18 'subID'=>array('86','64'), 19 ), 20 ), 21 '2019-01-01'=> array( 22 array( 23 'action'=>'apple', 24 'time'=>array('01-01','01-01'), 25 'targetID'=>'1', 26 'actorID'=>array('4','3'), 27 'subID'=>array('1','33'), 28 ), 29 ), 30);
###該当のソースコード
こちらが連結のためのソースコードです。
//【処理2】同じactionがなければ、年月日の配列を連結して終了
がおかしいようですが、どのようにすべきでしょうか?
PHP
1foreach($new as $day => $contents) { 2 foreach($contents as $content) { 3 //【処理1】同じ年月日がなければ、年月日の配列を連結して終了 4 if(!isset($current[$day])) { 5 $current = array_merge($new, $current); 6 continue; 7 } 8 //【処理2】同じactionがなければ、年月日の配列を連結して終了 9 if($current[$day]['action'] !== $content['action']) { 10 $current = array_merge($new, $current); 11 continue; 12 } 13 //【処理3】同じ年月日で同じactionがあれば、年月日の配列の中の3つの配列を連結して、新しい20個だけをとっておく 14 for($i = 0; $i < count($current[$day]); $i++) { 15 $current[$day][$i]['time'] = array_slice(array_merge([$content['time']], $current[$day][$i]['time']), 0, 20); 16 $current[$day][$i]['actorID'] = array_slice(array_merge([$content['actorID']], $current[$day][$i]['actorID']), 0, 20); 17 $current[$day][$i]['subID'] = array_slice(array_merge([$content['subID']], $current[$day][$i]['subID']), 0, 20); 18 } 19 //新しいのを上に 20 $sortkey = array_map(function($ar) { return $ar[0];}, array_column($current[$day], 'time')); 21 array_multisort($sortkey, SORT_DESC,$current[$day]); 22 } 23} 24var_export($current);
長くなってしまって申し訳ございません。お気づきの点があればなんでも仰ってください。
どうぞ宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー