前提・実現したいこと
PHPで配列を連結するシステムを作っています。
$new_post_info_wrapperと$leave_post_info_wrapperという配列があり、いずれも'insert_name'というキーを持っています。
これらを以下の条件で連結したいのですが、2の条件が実現できません。
1.同じ'insert_name'で、get_result_post_info_wrapper()の第一引数が'infinity'なら、同じところに追加する。
2.違う'insert_name'なら新しく追加する。
発生している問題
以下のように、いずれの配列も'insert_name'が'julia'と'ally'なら実現できるのですが、'julia'と'smith'などになるとできなくなってしまいます。
該当のソースコード
以下のように、いずれの配列も'julia'と'ally'なら問題なく連結できて$resultを作ることができます。
PHP
1// データベースにある配列 2$leave_post_info_wrapper= [ 3 [ 4 'insert_name' => 'julia', 5 'present_info_arr' => [ ['id'=>1,'present_type'=>'a'] ], 6 ], 7 [ 8 'insert_name' => 'ally', 9 'present_info_arr' => [ ['id'=>2,'area'=>'kanagawa','present_type'=>'b'], ['id'=>3,'area'=>'chiba','present_type'=>'c'] ], 10 ], 11]; 12 13// 新しく追加する配列 14$new_present_info_wrapper = [ 15 [ 16 'insert_name' => 'julia', 17 'present_info_arr' => [ ['id'=>4,'area'=>'saitama','present_type'=>'d'] ], 18 ], 19 [ 20 'insert_name' => 'ally', 21 'present_info_arr' => [ ['id'=>5,'area'=>'gunma','present_type'=>'e'] ], 22 ], 23]; 24 25// 最終的な配列 26$result = [ 27 [ 28 'insert_name' => 'julia', 29 'present_info_arr' => [ ['id'=>1,'present_type'=>'a'], ['id'=>4,'present_type'=>'d'] ], 30 ], 31 [ 32 'insert_name' => 'ally', 33 'present_info_arr' => [ ['id'=>2,'area'=>'kanagawa','present_type'=>'b'], ['id'=>3,'area'=>'chiba','present_type'=>'c'], ['id'=>5,'area'=>'gunma','present_type'=>'e'] ], 34 ], 35]; 36
試したこと
こちらはいずれの配列も'julia'と'ally'なので実行すると連結できます。(実行サンプル)
しかし、get_leave_post_info_wrapper()で取得される配列を'ally'から'smith'など別の名前にすると連結できなくなるという問題が生じることがご確認いただけるかと思います。
php
1<?php 2// 新しく追加する配列 3$new_post_info_wrapper = [ 4 [ 5 'insert_name' => 'julia', 6 'post_info_arr' => [ ['id'=>4,'area'=>'saitama','post_type'=>'d'] ], 7 ], 8 [ 9 'insert_name' => 'ally', 10 'post_info_arr' => [ ['id'=>5,'area'=>'gunma','post_type'=>'e'] ], 11 ], 12]; 13 14// infinityで、かつ同じinsert_nameの場合に連結したい 15$result = get_result_post_info_wrapper( 'infinity', $new_post_info_wrapper ); 16var_dump( $result ); 17 18// 最終的な配列 19function get_result_post_info_wrapper( $process, $new_post_info_wrapper ){ 20 $result = []; 21 22 // データベースから現在値を取得 23 $leave_post_info_wrapper = get_leave_post_info_wrapper(); 24 25 // 現在値がなければ 26 if( empty($leave_post_info_wrapper) ){ 27 $result = ext_post_info_wrapper_for_leave( $new_post_info_wrapper ); 28 } 29 30 // 現在値があれば 31 else{ 32 foreach( $leave_post_info_wrapper as &$leave_wrapper ){ 33 $leave_insert_name = $leave_wrapper['insert_name']; 34 $leave_post_info_arr = $leave_wrapper['post_info_arr']; 35 36 foreach( $new_post_info_wrapper as $new_wrapper ){ 37 $new_insert_name = $new_wrapper['insert_name']; 38 $new_post_info_arr = $new_wrapper['post_info_arr']; 39 40 // 必要な情報だけ抽出 41 foreach( $new_post_info_arr as &$new_post_info ){ 42 $exted_post_info = ext_post_info( $new_post_info ); 43 } 44 45 // insert_nameが同じものがある場合 46 if( $new_insert_name == $leave_insert_name ){ 47 48 // 無限ロードなら追加 49 if( $process == 'infinity' ){ 50 if( $leave_wrapper['insert_name'] == $new_insert_name ){ 51 $leave_wrapper['post_info_arr'][] = $exted_post_info; 52 $result = $leave_post_info_wrapper; 53 } 54 } 55 } 56 57 // 新しい insert_name の場合 58 else{ 59 $result = ext_post_info_wrapper( $new_post_info_wrapper ); 60 } 61 } 62 } 63 } 64 65 return $result; 66} 67 68// データベースにある配列 69function get_leave_post_info_wrapper(){ 70 return [ 71 [ 72 'insert_name' => 'julia', 73 'post_info_arr' => [ ['id'=>1,'post_type'=>'a'] ], 74 ], 75 [ 76 'insert_name' => 'ally', 77 'post_info_arr' => [ ['id'=>2,'area'=>'kanagawa','post_type'=>'b'], ['id'=>3,'area'=>'chiba','post_type'=>'c'] ], 78 ], 79 ]; 80} 81 82// post_info_wrapper から必要な値を抽出 83function ext_post_info_wrapper( $post_info_wrapper ){ 84 foreach( $post_info_wrapper as &$wrapper ){ 85 $new_post_info_arr = $wrapper['post_info_arr']; 86 87 foreach( $new_post_info_arr as &$new_post_info ){ 88 $wrapper['post_info_arr'] = []; 89 $wrapper['post_info_arr'][] = ext_post_info( $new_post_info ); 90 } 91 } 92 return $post_info_wrapper; 93} 94 95// post_info から必要な値を抽出 96function ext_post_info( $post_info ){ 97 98 $exted_post_info = []; 99 $post_type = $post_info['post_type']; 100 101 // 抽出したい情報を指定 102 if( $post_type == 'a' ){ 103 $key_arr = ['post_type','id']; 104 } 105 else{ 106 $key_arr = ['post_type','area']; 107 } 108 109 // 抽出 110 foreach( $key_arr as $key ){ 111 $exted_post_info[$key] = $post_info[$key]; 112 } 113 114 return $exted_post_info; 115} 116 117
補足情報
post_info_wrapperを対象としたext_post_info_wrapper()があり、post_infoを対象としたext_post_info()がある。という流れは変えたくないと思っています。(それぞれ別の場所でも実行したいためです。)
つまりget_result_post_info_wrapper()の調整だけで実現できれば、というのが理想です。
どうぞ宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/21 22:47