質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

506閲覧

PHPによる配列の変換で、ループの処理がうまくいかないです

mikan1998

総合スコア7

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2020/01/05 16:51

###実現したいこと
配列の変換ができなくて困っています。
$init_arr を $reslt_arr へと変換したいです。

###該当のソースコード
変換前はこちらです。

php

1$init_arr = [ 2 [ 'item'=>'A', 'title'=>'apple' ], 3 [ 'item'=>'B', 'title'=>'banana' ], 4 [ 'item'=>'A', 'title'=>'apricot' ] 5];

変換後はこうなり、item に応じた area_name をつけて、別々の配列に分ける感じを目指しています。

php

1$reslt_arr = [ 2 [ 3 'area_name' => 'area_A', 4 'info_arr' => [ 5 [ 'item'=>'A', 'title'=>'apple', 'area_name'=>'area_A' ], 6 [ 'item'=>'A', 'title'=>'apricot', 'area_name'=>'area_A' ], 7 ] 8 ], 9 [ 10 'area_name' => 'area_B', 11 'info_arr' => [ 12 [ 'item'=>'B', 'title'=>'banana', 'area_name'=>'area_B' ], 13 ] 14 ], 15];

###試したこと
まず $init_arr に area_name はないので、
foreach でループさせ、その中で area_name を生成します。

あとはその area_name に応じて $init_arr を分けていけば $reslt_arr ができると考えたのですが、結果的に area_B が生成されず、area_A に3つとも入ってしまいました。それが下記 $interim_arr です。

$reslt_arr のように、area_A と area_B に分けたいのですが、下記ですとどこを直したらいいでしょうか。

php

1<?php 2 3$init_arr = [ 4 [ 'item'=>'A', 'title'=>'apple' ], 5 [ 'item'=>'B', 'title'=>'banana' ], 6 [ 'item'=>'A', 'title'=>'apricot' ] 7]; 8 9$i = 0; 10$info_arr = []; 11foreach ( $init_arr as $init_val ) { 12 13 $item = $init_val['item']; 14 $area_name = 'area_' . $item; 15 $title = $init_val['title']; 16 17 // もし可能ならばこれ以下の部分だけの修正で実現したいです 18 19 $info = [ 20 'area_name' => $area_name, 21 'item' => $item, 22 'title' => $title, 23 ]; 24 25 $info_arr[$i] = $info; 26 27 $interim_arr = [[ 28 'area_name' => $area_name, 29 'info_arr' => [], 30 ]]; 31 $interim_arr[0]['info_arr'] = $info_arr; 32 33 $i++; 34} 35 36var_dump( $interim_arr ); // ここで $reslt_arr と同じものを取得したいです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ちょっと使いにくそうなデータですけど、加工してみました。

php

1<?php 2$init_arr = [ 3 [ 'item'=>'A', 'title'=>'apple' ], 4 [ 'item'=>'B', 'title'=>'banana' ], 5 [ 'item'=>'A', 'title'=>'apricot' ] 6]; 7$reslt_arr = [ 8 [ 9 'area_name' => 'area_A', 10 'info_arr' => [ 11 [ 'item'=>'A', 'title'=>'apple', 'area_name'=>'area_A' ], 12 [ 'item'=>'A', 'title'=>'apricot', 'area_name'=>'area_A' ], 13 ] 14 ], 15 [ 16 'area_name' => 'area_B', 17 'info_arr' => [ 18 [ 'item'=>'B', 'title'=>'banana', 'area_name'=>'area_B' ], 19 ] 20 ], 21]; 22$for_allocation =[ 23 'A' => 0, 24 'B' => 1, 25]; 26$res = [ 27 [ 28 'area_name' => 'area_A', 29 'info_arr' => [], 30 ], 31 [ 32 'area_name' => 'area_B', 33 'info_arr' => [], 34 ], 35]; 36 37foreach($init_arr as $v){ 38 $tmp = $v + ['area_name'=>'area_' . $v['item']]; 39 $res[$for_allocation[$v['item']]]['info_arr'][]=$tmp; 40} 41 42var_export($reslt_arr===$res); 43// var_dump($reslt_arr); 44// var_dump($res);

$reslt_arr の key を 'area_name' にしたほうが使い勝手が良いと思います。

php

1$reslt_arr = [ 2 'area_A' => [ 3 [ 'item'=>'A', 'title'=>'apple', 'area_name'=>'area_A' ], 4 [ 'item'=>'A', 'title'=>'apricot', 'area_name'=>'area_A' ], 5 ], 6 'area_B' => [ 7 [ 'item'=>'B', 'title'=>'banana', 'area_name'=>'area_B' ], 8 ], 9];

みたいな。

投稿2020/01/05 23:55

編集2020/01/06 00:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikan1998

2020/01/06 07:47

foreachの処理が難しいですが、すっきりしていていいですね。 使い勝手の件ですが、下記のように iroiro などもこの階層にありうるので、キーは付けずにこのままでいこうと思います。たくさんのアドバイスをありがとうございました。 $reslt_arr = [ [ 'area_name' => 'area_A', 'iroiro' => '', 'info_arr' => [ [],[] ] ], [ 'area_name' => 'area_B', 'iroiro' => '', 'info_arr' => [ [],[] ] ], ];
guest

0

ベストアンサー

PHP

1<?php 2 3$init_arr = [ 4 [ 'item'=>'A', 'title'=>'apple' ], 5 [ 'item'=>'B', 'title'=>'banana' ], 6 [ 'item'=>'A', 'title'=>'apricot' ] 7]; 8 9$info_arr = []; 10foreach ( $init_arr as $init_val ) { 11 12 $item = $init_val['item']; 13 $area_name = 'area_' . $item; 14 $title = $init_val['title']; 15 16 17 $info = [ 18 'area_name' => $area_name, 19 'item' => $item, 20 'title' => $title, 21 ]; 22   //area_name毎に振り分ける 23 $area_arr[$area_name]['area_name']=$area_name; 24 $area_arr[$area_name]['info_arr'][] = $info; 25 26 27} 28   //area_arr配列の添え字を連番に直す 29 $interim_arr = array_values($area_arr); 30var_dump( $interim_arr ); 31 32?> 33

投稿2020/01/05 23:41

編集2020/01/06 00:07
Take_it

総合スコア357

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Take_it

2020/01/05 23:45

//area_arr配列の添え字を連番に直す は、正しくは、 $area_arrの中身を1つずつ取り出して、キーを指定せず$interim_arrに放り込んでいます。 $area_arrはキーがarea_nameなので、そのままでよければこの処理はやめて$area_arrをそのまま結果として使ってもいいでしょう。
mikan1998

2020/01/06 07:38

$area_nameをキーにすれば区別できるけど、そうじゃないんだよなあ、と思っていたのですが、いったんキーにしてからarray_valuesでキーを削除するとは、思いつきませんでした。なるほど。ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/01/06 08:56

仕様的にどう判断されるかわかりませんが、連番が保証されません。 $init_arr = [ [ 'item'=>'B', 'title'=>'hogehoge'], [ 'item'=>'A', 'title'=>'apple' ], [ 'item'=>'B', 'title'=>'banana' ], [ 'item'=>'A', 'title'=>'apricot' ] ]; だと、[0] に B が入ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問