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

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

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

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1677閲覧

[PHP] 連想配列をjson形式に変換する時の事ですが、形式を入れ子にする方法が分かりませんでした。連想配列を入れ子にするのだと思いましたがみつからずです。

rocket

総合スコア41

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2021/12/20 04:03

編集2021/12/20 05:34

CakePHPです。
PHP Version 7.2.34(localhostにアクセスして頭に表示されている)

目的は、モデルから取り出したデータをjsonにしてかえそうとしています。

DBを個別に取り出しているのは、まだ間もないためModelの操作が分からないためです。
そこで各テーブルに個別にアクセスして、取り出したデータを以下の「本来取り出したい形」にあるjsonの形にしたいのですが、方法が分かりませんでした。
入れ子に出来るはずだと思っています。
この方法を教えて頂きたいです。

よろしくお願いいたします。

本来作りたい形

json

1{ 2 "userdata": { 3 "id": 1, 4 "name": "test_user", 5 "units": [], 6 "items": [{ 7 "id": 1, 8 "user_id": 1, 9 "unit_id": 1, 10 "exp": 0, 11 "level": 1, 12 "equipment1": 0, 13 "equipment2": 0, 14 "equipment3": 0, 15 "equipment4": 0 16 }] 17 }, 18 19}

調べながら、試したコードは3つほど以下のようになります。

● 一つ目

php

1$id = 1; 2$query = TableRegistry::get('userdata'); 3$user = $query->find()->where(['id' => $id])->first(); 4$query_useritem = TableRegistry::get('useritem'); 5$items = $query_useritem->find()->where(['user_id' => $id]); 6$query_userunit = TableRegistry::get('userunit'); 7$units = $query_userunit->find()->where(['user_id' => $id]); 8 9//連想配列が繋がるだけでした。 10$ret = array($user,'units'=>$items,'items'=>$units); 11echo json_encode($ret);

出力結果

json

1{ 2 "0": { 3 "id": 1, 4 "name": "test_user" 5 }, 6 "units": [], 7 "items": [ 8 { 9 "id": 1, 10 "user_id": 1, 11 "unit_id": 1, 12 "exp": 0, 13 "level": 1, 14 "equipment1": 0, 15 "equipment2": 0, 16 "equipment3": 0, 17 "equipment4": 0 18 } 19 ] 20}

● 2つ目

php

1$id = 1; 2$query = TableRegistry::get('userdata'); 3$user = $query->find()->where(['id' => $id])->first(); 4$query_useritem = TableRegistry::get('useritem'); 5$items = $query_useritem->find()->where(['user_id' => $id]); 6$query_userunit = TableRegistry::get('userunit'); 7$units = $query_userunit->find()->where(['user_id' => $id]); 8 9// array_merge()を使った場合 10$user = array('userdata'=>$user); 11$user = array_merge($user, array('units'=>$units,'items'=>$items)); 12echo json_encode($user);

出力結果

json

1{ 2 "userdata": { 3 "id": 1, 4 "name": "test_user" 5 }, 6 "units": [ 7 { 8 "id": 1, 9 "user_id": 1, 10 "unit_id": 1, 11 "exp": 0, 12 "level": 1, 13 "equipment1": 0, 14 "equipment2": 0, 15 "equipment3": 0, 16 "equipment4": 0 17 } 18 ], 19 "items": [] 20}

● 3つ目

php

1$id = 1; 2$query = TableRegistry::get('userdata'); 3$user = $query->find()->where(['id' => $id])->first(); 4$query_useritem = TableRegistry::get('useritem'); 5$items = $query_useritem->find()->where(['user_id' => $id]); 6$query_userunit = TableRegistry::get('userunit'); 7$units = $query_userunit->find()->where(['user_id' => $id]); 8$user = array('userdata'=>$user); 9 10//一つのarrayにいれてみる。 11$array[] = $user; 12$array[] = $units; 13$array[] = $items; 14 15echo json_encode($array);

結果

json

1[ 2 { 3 "userdata": { 4 "id": 1, 5 "name": "test_user" 6 } 7 }, 8 [ 9 { 10 "id": 1, 11 "user_id": 1, 12 "unit_id": 1, 13 "exp": 0, 14 "level": 1, 15 "equipment1": 0, 16 "equipment2": 0, 17 "equipment3": 0, 18 "equipment4": 0 19 } 20 ], 21 [] 22]

ーー追記ーー

以下より

修正を試したところ「+=」演算子がの所でエラーになってしまいました
バージョンの問題かと思ったんですが、以下該当の行のエラーですが、

Notice (8): Object of class Cake\ORM\Query could not be converted to int [APP/Controller\UserController.php, line 27]

$user["units"] += $units;

ここで int に変換しようとしているようで、どちらも連想配列だと思うのですが。
違うのでしょうか。


修正したコード

php

1$id = 1; 2$query = TableRegistry::get('userdata'); 3$user = $query->find()->where(['id' => $id])->first(); 4$query_useritem = TableRegistry::get('useritem'); 5$items = $query_useritem->find()->where(['user_id' => $id]); 6$query_userunit = TableRegistry::get('userunit'); 7$units = $query_userunit->find()->where(['user_id' => $id]); 8 9$user["units"] += $units; 10$user["items"] += $items; 11echo json_encode($user);


「Unsupported operand types」が発生しています。

Notice (8): Object of class Cake\ORM\Query could not be converted to int [APP/Controller\UserController.php, line 27] Notice (8): Object of class Cake\ORM\Query could not be converted to int [APP/Controller\UserController.php, line 28]{"id":1,"name":"test_user","rank":1,"exp":0,"lastlogin":"2021-12-04T18:11:24+00:00","created":"2021-12-04T18:11:24+00:00","units":1,"items":1} Warning (512): Unable to emit headers. Headers sent in file=D:\_TechStadium20211101\ts\90_FinalProject\20_ServerProject\htdocs\PriconneR\vendor\cakephp\cakephp\src\Error\Debugger.php line=853 [CORE\src\Http\ResponseEmitter.php, line 48] Warning (2): Cannot modify header information - headers already sent by (output started at D:\_TechStadium20211101\ts\90_FinalProject\20_ServerProject\htdocs\PriconneR\vendor\cakephp\cakephp\src\Error\Debugger.php:853) [CORE\src\Http\ResponseEmitter.php, line 148] Warning (2): Cannot modify header information - headers already sent by (output started at D:\_TechStadium20211101\ts\90_FinalProject\20_ServerProject\htdocs\PriconneR\vendor\cakephp\cakephp\src\Error\Debugger.php:853) [CORE\src\Http\ResponseEmitter.php, line 181] Warning (2): Cannot modify header information - headers already sent by (output started at D:\_TechStadium20211101\ts\90_FinalProject\20_ServerProject\htdocs\PriconneR\vendor\cakephp\cakephp\src\Error\Debugger.php:853) [CORE\src\Http\ResponseEmitter.php, line 181] Unsupported operand types Error


バージョン確認してみました。
PHP Version 7.2.34
CakePHP

$ php bin/cake ################################################################################ # # Cake is a shell script for invoking CakePHP shell commands # # CakePHP(tm) : Rapid Development Framework (https://cakephp.org) # Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) # # Licensed under The MIT License # For full copyright and license information, please see the LICENSE.txt # Redistributions of files must retain the above copyright notice. # # @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) # @link https://cakephp.org CakePHP(tm) Project # @since 1.2.0 # @license https://opensource.org/licenses/mit-license.php MIT License # ################################################################################

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

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

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

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

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

guest

回答1

0

ベストアンサー

array_mergeも[A,B]もやっていることは同じことにしかなりません(インデックスが再生成されるか否かだけです。

もし、同階層に代入したい場合だけの場合は+演算子を使って、かつ明示的に挿入したいキーを付与するといいです。

PHP

1$user["user_data"] += $units; 2$user["user_data"] += $items; 3$user = json_encode($user); 4

これで確認してみてください。

投稿2021/12/20 05:03

FKM

総合スコア3647

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

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

rocket

2021/12/20 05:32

迅速な回答ありがとうございます。 早速試したところ、エラーが出てしまい追記いたしました。 「+=」演算子がの所でエラーになるのですが、 バージョンの問題かと思ったんですが、エラーでは 以下該当の行でのエラーですが Notice (8): Object of class Cake\ORM\Query could not be converted to int [APP/Controller\UserController.php, line 27] > $user["units"] += $units; ここで int に変換しようとしているようなので、分からなくなっています。 どちらも連想配列だと思うのですが。
rocket

2021/12/20 05:41

以下のコードで試しましたところ。 +=演算子も結果も意図通りとなり問題がありませんでした。 という事は、CakePHPでModelから取得する際の型が違うということですよね、、、 しかし、なんでしょう、 json_encode()で見ると、どれも連想配列だと思うのですが違うのでしょうか。 $abc = array("a"=>1); $cde = array("b"=>[5,3,3]); $abc += $cde; echo json_encode($abc); 結果 { "a": 1, "b": [ 5, 3, 3 ] }
FKM

2021/12/20 05:43

なるほど、元はオブジェクトですね。だったら、配列と同じ方法だと無理ですね。 テストデータは配列を使っていました。ちょっと自分も調べてみます。
rocket

2021/12/20 06:11 編集

ありがとうございます。 ひとまず該当部分のテスト結果を共有します。 $user = json_decode(json_encode($user), true); //$items = json_decode(json_encode($items), true);//試した $user["items"] += $items; echo json_encode($user); エラーがでまして、 ‘‘‘ ■ Notice (8): Undefined index: items [APP/Controller\UserController.php, line 32] ■ Notice (8): Object of class Cake\ORM\Query could not be converted to int [APP/Controller\UserController.php, line 32] { "id": 1, "name": "test_user", "rank": 1, "exp": 0, "lastlogin": "2021-12-04T18:11:24+00:00", "created": "2021-12-04T18:11:24+00:00", "items": 1 } ・↑、このエラーからみると、itemsの所にこういうintになってしようとしてる感じなのですね。 以下は元のまま {"id":1,"name":"test_user","rank":1,"exp":0,"lastlogin":"2021-12-04T18:11:24+00:00","created":"2021-12-04T18:11:24+00:00","items":1}{"0":{"id":1,"name":"test_user","rank":1,"exp":0,"lastlogin":"2021-12-04T18:11:24+00:00","created":"2021-12-04T18:11:24+00:00"},"units":[],"items":[{"id":1,"user_id":1,"unit_id":1,"exp":0,"level":1,"equipment1":0,"equipment2":0,"equipment3":0,"equipment4":0}]}{"userunits":[{"id":1,"user_id":1,"unit_id":1,"exp":0,"level":1,"equipment1":0,"equipment2":0,"equipment3":0,"equipment4":0}]}| []| ■ Warning (512): Unable to emit headers. Headers sent in file=D:\_TechStadium20211101\ts\90_FinalProject\20_ServerProject\htdocs\PriconneR\vendor\cakephp\cakephp\src\Error\Debugger.php line=853 [CORE\src\Http\ResponseEmitter.php, line 48] ‘‘‘‘
rocket

2021/12/20 06:05

また、オブジェクトである事は了解いたしました。ありがとうございます。
rocket

2021/12/20 06:17

このようにしてみると、「Undefined index」の問題だけなのが分かりました。 未定義なら定義してあげればいいとは思って調べていますが。 ーーーー $user = json_decode(json_encode($user), true); $items = json_decode(json_encode($items), true); $user["items"] += $items; echo json_encode($user); ーーーーー 以下のエラーになるのでintは出てこなくなりました。 Notice (8): Undefined index: items [APP/Controller\UserController.php, line 31] Warning (512): Unable to emit headers. Headers sent in file=D:\_TechStadium20211101\ts\90_FinalProject\20_ServerProject\htdocs\PriconneR\vendor\cakephp\cakephp\src\Error\Debugger.php line=853 [CORE\src\Http\ResponseEmitter.php, line 48]
FKM

2021/12/20 06:17

海外のサイトなども巡回すると、 $array = (array) $obj; ができるようなことも書いてますね。
rocket

2021/12/20 06:23

できました。 3つのオブジェクトを、配列に直してあまりよくは無いかもしれませんが 今はこれで動かせるようになりそうなので大変助かりました。 ーーーーーーーーーーー $user = json_decode(json_encode($user), true); $items = json_decode(json_encode($items), true); // $units = json_decode(json_encode($units), true); $user += array('items'=>$items); $user += array('units'=>$units); echo json_encode($user); ーーーーーーーーーーー { "id": 1, "name": "test_user", "rank": 1, "exp": 0, "lastlogin": "2021-12-04T18:11:24+00:00", "created": "2021-12-04T18:11:24+00:00", "items": [], "units": [ { "id": 1, "user_id": 1, "unit_id": 1, "exp": 0, "level": 1, "equipment1": 0, "equipment2": 0, "equipment3": 0, "equipment4": 0 } ] }
rocket

2021/12/20 06:24

FKM様、お付き合いいただいて大変ありがとうございました。mm $array = (array) $obj; なるほど
FKM

2021/12/20 06:27 編集

undefined indexは配列を定義した際に、インデックスが定義されていないだけの軽いエラーなので $user = ["user"=>""]; $user['items'] += $items; とすれば大丈夫です。 あと、手段が強引かと思われても、結局テンプレートに返すときに配列化しますので、問題ないですよ。 あと(array )$objは多重オブジェクトに対応していないので、やはりさっきの方法3が一番適切だと思われますね。
rocket

2021/12/20 06:28

回避策も含めありがとうございます。 方法③でやっていきます。 PS. (array)のキャスト?試してみたら文字化けみたいになりました。 {"\u0000*\u0000_accessible":{"name":true,"rank":true,"exp":true,"lastlogin":true,"created":true},"\u0000*\u0000_properties":{"id":1,"name":"test_user","rank":1,"exp":0,"lastlogin":"2021-12-04T18:11:24+00:00","created":"2021-12-04T18:11:24+00:00"},"\u0000*\u0000_original":[],"\u0000*\u0000_hidden":[],"\u0000*\u0000_virtual":[],"\u0000*\u0000_className":null,"\u0000*\u0000_dirty":[],"\u0000*\u0000_new":false,"\u0000*\u0000_errors":[],"\u0000*\u0000_invalid":[],"\u0000*\u0000_registryAlias":"userdata","items":{"\u0000*\u0000_hasFields":null,"\u0000*\u0000_autoFields":null,"\u0000*\u0000_hydrate":true,"\u0000*\u0000_counter":null,"\u0000*\u0000_eagerLoader":null,"\u0000*\u0000_beforeFindFired":false,"\u0000*\u0000_resultsCount":null,"\u0000*\u0000_connection":{},"\u0000*\u0000_type":"select","\u0000*\u0000_parts":{"delete":true,"update":[],"set":[],"insert":[],"values":[],"select":[],"distinct":false,"modifier":[],"from":[],"join":[],"where":{},"group":[],"having":null,"order":null,"limit":null,"offset":null,"union":[],"epilog":null},"\u0000*\u0000_dirty":true,"\u0000*\u0000_resultDecorators":[],"\u0000*\u0000_iterator":null,"\u0000*\u0000_valueBinder":null,"\u0000*\u0000_functionsBuilder":null,"\u0000*\u0000_useBufferedResults":true,"\u0000*\u0000_selectTypeMap":null,"\u0000*\u0000typeCastEnabled":true,"\u0000*\u0000_typeMap":{},"\u0000*\u0000_repository":{},"\u0000*\u0000_results":null,"\u0000*\u0000_mapReduce":[],"\u0000*\u0000_formatters":[],"\u0000*\u0000_cache":null,"\u0000*\u0000_options":[],"\u0000*\u0000_eagerLoaded":false},"units":{"\u0000*\u0000_hasFields":null,"\u0000*\u0000_autoFields":null,"\u0000*\u0000_hydrate":true,"\u0000*\u0000_counter":null,"\u0000*\u0000_eagerLoader":null,"\u0000*\u0000_beforeFindFired":false,"\u0000*\u0000_resultsCount":null,"\u0000*\u0000_connection":{},"\u0000*\u0000_type":"select","\u0000*\u0000_parts":{"delete":true,"update":[],"set":[],"insert":[],"values":[],"select":[],"distinct":false,"modifier":[],"from":[],"join":[],"where":{},"group":[],"having":null,"order":null,"limit":null,"offset":null,"union":[],"epilog":null},"\u0000*\u0000_dirty":true,"\u0000*\u0000_resultDecorators":[],"\u0000*\u0000_iterator":null,"\u0000*\u0000_valueBinder":null,"\u0000*\u0000_functionsBuilder":null,"\u0000*\u0000_useBufferedResults":true,"\u0000*\u0000_selectTypeMap":null,"\u0000*\u0000typeCastEnabled":true,"\u0000*\u0000_typeMap":{},"\u0000*\u0000_repository":{},"\u0000*\u0000_results":null,"\u0000*\u0000_mapReduce":[],"\u0000*\u0000_formatters":[],"\u0000*\u0000_cache":null,"\u0000*\u0000_options":[],"\u0000*\u0000_eagerLoaded":false}}
FKM

2021/12/20 06:29

文字化けというよりjsonコードですね。やはり方法3のようにjson_decodeを使う理由がよくわかります…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問