###実現したいこと
PHP初心者で、配列の合体がどうしてもできません。
下記の「現在の配列$current
」と「新しい配列$new
」を合体して、「目的の配列$update
」にしたいと考えています。
###そのための条件
合体の条件は3つありまして、
➀thread_id
が同じなら次の➁➂で合体する。違えば「新しい配列$new_array
」を先頭にして普通に連結する。
合体させるときは、
➁time
、sender_id
、read
の3つについて、新しい配列の値だけを使う。
➂新しい配列を先頭に持っていく。
です。
これを実現するために文末のソースコードを書いて奮闘しているのですが、どうしてもできず、質問させて頂きました。
###「現在の配列($current_array)」と「新しい配列($current_array)」
まずこの2つの配列のうちthread_id
が同じものを合体させたいです。
php
1<?php 2/* 3* 現在の配列($current_array) 4* いくつあるか不明(例として次の2つ) 5*/ 6$current_array = array( 7 array( 8 'action'=>'message', 9 'time'=>'16', 10 'sender_id'=>'9', 11 'recipient_id'=>'1', 12 'read'=>'ok', 13 'thread_id'=>'8' 14 ), 15 array( 16 'action'=>'message', 17 'time'=>'13', 18 'sender_id'=>'4', 19 'recipient_id'=>'1', 20 'read'=>'ok', 21 'thread_id'=>'5' 22 ), 23); 24 25/* 26* 新しい配列($new_array) 27* 1つだけ 28*/ 29$new_array = array( 30 array( 31 'action'=>'message', 32 'time'=>'18', 33 'sender_id'=>'9', 34 'recipient_id'=>'1', 35 'read'=>'yet', 36 'thread_id'=>'5' 37 ), 38);
###「目的の配列($current)」
上の2つの合体で作りたいのが下記になります。
php
1<?php 2/* 3* 目的の配列($update_array) 4*/ 5$current_array = array( 6 array( // thread_idが同じなので合体した 7 'action'=>'message', 8 'time'=>'18', 9 'sender_id'=>'9', 10 'recipient_id'=>'1', 11 'read'=>'yet', 12 'thread_id'=>'5' 13 ), 14 array( // thread_idが違うので変化なし 15 'action'=>'message', 16 'time'=>'16', 17 'sender_id'=>'9', 18 'recipient_id'=>'1', 19 'read'=>'ok', 20 'thread_id'=>'8' 21 ), 22); 23
###考えているソースコード
あくまでイメージですが、このような流れになるのではと書いてみました。
素人の付け焼刃ゆえ、お目汚しかとは思いますが…
php
1<?php 2/* 3* $current_arrayと$new_arrayの合体の関数 4* usage: $update_array = mymerge($new_array, $current_array); 5*/ 6function mymerge($arg1, $arg2) { 7 foreach ($arg1 as $new => $newVal) { 8 foreach ($arg2 as $current => $currentVal) { 9 // thread_id が同じ場合は、新しい配列の値を採用して、新しい配列を先頭に持っていく 10 if ( $new[5]['thread_id'] == $current[5]['thread_id'] ) { 11 $currentVal['time'] = $newVal['time']; 12 $currentVal['sender_id'] = $newVal['sender_id']; 13 $currentVal['read'] = $newVal['read']; 14 return $arg2; 15 } 16 // thread_id が異なる場合は現在の配列と新しい配列を結合して、新しい配列を先頭に持っていく 17 else{ 18 $arg1_arg2 = array_merge($arg1, $arg2); 19 return $arg1_arg2; 20 } 21 } 22 } 23} 24 25 26/* 27* 上の関数を使って、目的の配列 ($update_array)を作る 28*/ 29$update_array = mymerge( $new_array, $current_array ); 30var_export($update_array); 31?>
どのようにすればmymerge
は「目的の配列($update_array)」を作れるような関数にできがるでしょうか。
質問で分かりにくい点などございましたらご指摘ください。
回答2件
あなたの回答
tips
プレビュー