###実現したいこと
後述する「該当の配列($base_arr
と$new_arr
)」を条件に従って連結し、次の$update_arr
を作りたいです。
php
1$update_arr = array( 2 array( 3 'time' => ['1558432388750'], 4 'action' => 'lose', 5 'target_id' => '76', 6 'actor_id' => ['87'], 7 'type' => 'a', 8 ), 9 array( 10 'time' => [0000000000000,'1558432437780','1558432449937'], // 連結した結果こうなる 11 'action' => 'get', 12 'target_id' => '10', 13 'actor_id' => ['3','9','51'], // 連結した結果こうなる 14 'type' => 'a', // ここは a になる 15 ) 16);
###該当の配列
こちらが素材となる配列です。
php
1/* 2$base_arr 3元からある、0個以上の配列(今回は2つ) 4*/ 5$base_arr = array( 6 array( 7 'time' => ['1558432388750'], 8 'action' => 'lose', 9 'target_id' => '76', 10 'actor_id' => ['87'], 11 'type' => 'a', 12 ), 13 array( 14 'time' => ['1558432437780','1558432449937'], 15 'action' => 'get', 16 'target_id' => '10', 17 'actor_id' => ['9','51'], 18 'type' => 'b', 19 ) 20); 21 22/* 23$new_arr 24新しく連結される配列で、常に1つ 25*/ 26$time_ux = ceil(microtime(true)*1000); 27$new_arr = array( 28 array( 29 'time' => [$time_ux], 30 'action' => 'get', 31 'target_id' => '10', 32 'actor_id' => ['3'], 33 'type' => 'a', 34 ) 35); 36
連結の条件としては、
➀ ``$base_arr`` のどれかの ``'action'`` が、``$new_arr`` の ``'action'`` と同じであること。 ➁ ``$base_arr`` のどれかの ``'target_id'`` が、``$new_arr`` の ``'target_id'`` と同じであること。 この➀➁を両方とも満たした場合に配列を連結したい。という感じで、その結果が冒頭の「実現したいこと」にある``$update_arr``となります。
###発生している問題
下記の「試したこと」にあるコードで挑戦してみました。
ですが、$base_arr
の'lose'
の配列にまで$new_arr
が連結されてしまうという状況です。
$new_arr
の'action'
は'get'
なのに、なぜ'lose'
の方にまで連結されてしまうのでしょうか。
###試したこと
こちらが問題の発生するコードです。
php
1 2// 素材となる配列 3$base_arr = get_base_arr(); 4$new_arr = get_new_arr(); 5 6// $base_arr がない場合 7if( empty($base_arr) || is_null($base_arr) ){ 8 $update_arr = $new_arr; 9} 10 11// すでに $base_arr がある場合 12else{ 13 foreach ( $base_arr as $base_keys ){ 14 if( $base_keys['action'] == $new_arr[0]['action'] && $base_keys['target_id'] == $new_arr[0]['target_id'] ){ 15 for( $i = 0; $i < count($base_arr); $i++ ) { 16 $base_arr[$i]['time'] = array_slice( array_merge($new_arr[0]['time'], $base_arr[$i]['time']), 0, 20 ); 17 $base_arr[$i]['actor_id'] = array_slice( array_merge($new_arr[0]['actor_id'], $base_arr[$i]['actor_id']), 0, 20 ); 18 $base_arr[$i]['type'] = 'a'; 19 } 20 } 21 $update_arr = $base_arr; 22} 23 24// 確認 25var_export($update_arr); 26
サンプルをご用意いたしましたので、ご確認頂ければと思います。
https://3v4l.org/TXjQc
宜しくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/21 11:24
2019/05/21 12:08
2019/05/21 12:20
2019/05/21 12:35
2019/05/21 12:56