###実現したいこと
PHPのforeach
で、一回目のループで取得した値を、二回目のループにねじ込みたいです。
###ソースコード・問題点
次の関数print_thread_datas()
をご覧ください。
引数$arg_wrapper
をループし、一回目のループで掲示板のレコードを取得し、二回目のループでコメントのレコードを取得するという関数です。
ここでコメントの取得に際して問題があります。
コメントの取得では、掲示板のレコードだけが持つ値top_comment_id
が必要となっており、二回目のループにそれをねじ込みたいのですが、なぜかできません。
php
1$arg_wrapper = [ 2 // thread エリアに thread_id=1 の掲示板を出力するための引数 3 'thread' => [ 4 'process' => 'pjax', 5 'arg' => ['type'=>'thread', 'thread_id'=>1], 6 ], 7 // comments エリアにthread_id=1の掲示板へのコメントを出力するための引数 8 'comments' => [ 9 'process' => 'pjax', 10 'arg' => ['type'=>'comment', 'thread_id'=>1, 'limit'=>2, 'last_comment_id'=>20, 'order_by'=>'popular_order'], 11 ] 12]; 13$results = print_thread_datas( $arg_wrapper ); 14var_dump($results); 15 16// $arg_wrapperに応じてスレッドのタイトルとコメントリストを返す 17function print_thread_datas( $arg_wrapper ) { 18 $results = []; 19 foreach ( $arg_wrapper as $print_area => $info ) { 20 21 // レコードを取得 22 $arg = $info['arg']; 23 $rows = get_rows( $arg ); 24 if ( $print_area === 'thread' ) { 25 $results[$print_area] = $rows[0]; // thrread は一件だけ 26 } else { 27 $results[$print_area] = $rows; // comments は複数 28 } 29 30 // thread の場合 31 if ( $print_area === 'thread' ) { 32 // コメントリストの先頭に固定されるコメントを取得するための引数をねじ込む 33 $top_comment_id = $rows[0]['top_comment_id'] ?? ''; 34 if ( $top_comment_id ) { 35 $arg_wrapper['comments']['arg']['top_comment_id'] = $top_comment_id; 36 } 37 38 // ねじ込めたことを確認 39 var_dump($arg_wrapper); 40 } 41 } 42 return $results; 43} 44 45 46// $argに応じてデータベースからレコード($rows)を取得する例 47function get_rows( $arg ){ 48 $rows; 49 $type = $arg['type']; 50 if ( $type === 'thread' ) { 51 $rows = [ ['type'=>'thread', 'thread_id'=>1, 'title'=>'1の掲示板', 'author_id'=>100, 'author_name'=>'鈴木', 'top_comment_id'=>99] ]; 52 } elseif ( $type === 'comment' ) { 53 $rows = [ 54 ['type'=>'comment', 'thread_id'=>1, 'comment_id'=>30, 'content'=>'こんにちは', 'author_id'=>200, 'author_name'=>'佐藤'], 55 ['type'=>'comment', 'thread_id'=>1, 'comment_id'=>40, 'content'=>'さようなら', 'author_id'=>300, 'author_name'=>'山田'] 56 ]; 57 // コメントリストの先頭に固定されるコメントを取得 58 if ( isset( $arg['top_comment_id'] ) ) { 59 $top_comment = ['type'=>'comment', 'thread_id'=>1, 'comment_id'=>99, 'content'=>'先頭に固定されるコメントです', 'author_id'=>400, 'author_name'=>'高橋']; 60 array_unshift( $rows, $top_comment ); 61 } 62 } 63 return $rows; 64} 65
###現状と目的
上記コードで得られる現状には、先頭に固定するコメント('comment_id'=>99
)が追加されず以下となります。
php
1$results = [ 2 'thread' => ['type'=>'thread', 'thread_id'=>1, 'title'=>'1の掲示板', 'author_id'=>100, 'author_name'=>'鈴木', 'top_comment_id'=>99], 3 'comments' => [ 4 ['type'=>'comment', 'thread_id'=>1, 'comment_id'=>30, 'content'=>'こんにちは', 'author_id'=>200, 'author_name'=>'佐藤'], 5 ['type'=>'comment', 'thread_id'=>1, 'comment_id'=>40, 'content'=>'さようなら', 'author_id'=>300, 'author_name'=>'山田'] 6 ] 7];
目的はこうで、comments
の配列に先頭に固定するコメント('comment_id'=>99
)を追加したものになります。
php
1$results = [ 2 'thread' => ['type'=>'thread', 'thread_id'=>1, 'title'=>'1の掲示板', 'author_id'=>100, 'author_name'=>'鈴木', 'top_comment_id'=>99], 3 'comments' => [ 4 ['type'=>'comment', 'thread_id'=>1, 'comment_id'=>99, 'content'=>'先頭に固定されるコメントです', 'author_id'=>400, 'author_name'=>'高橋'], 5 ['type'=>'comment', 'thread_id'=>1, 'comment_id'=>30, 'content'=>'こんにちは', 'author_id'=>200, 'author_name'=>'佐藤'], 6 ['type'=>'comment', 'thread_id'=>1, 'comment_id'=>40, 'content'=>'さようなら', 'author_id'=>300, 'author_name'=>'山田'] 7 ] 8];
###試したこと
上記ソースコードにございますが// ねじ込めたことを確認
のダンプによって確認はとれていて、確かに先頭に固定するコメント('comment_id'=>99
)が、$arg_wrapper
にねじこめていると思うのですが、なぜ目的のような結果にできないのか…わかりません。
また以下ミニマムなarray_unshift
は問題なく追加できましたし、原因が特定できずにおります。
php
1$rows = [ ['comment_id'=>30], ['comment_id'=>40] ]; 2$top_comment = [ 'comment_id'=>99 ]; 3array_unshift($rows,$top_comment); 4var_dump($rows);
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/12 19:48