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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

2821閲覧

とある配列をJson化したい

Sorarinu

総合スコア23

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2016/10/18 03:20

編集2016/10/18 06:30

###前提・実現したいこと
現在,PHPを使って,与えられたツリー構造を持つ配列をJsonにして返すAPIを作成しております.
具体的には,

PHP

1array ( 2 0 => 3 array ( 4 'uri' => 'https://www.google.co.jp/', 5 'title' => 'Google', 6 'note' => '', 7 'tags' => 'ブックマーク バー', 8 'time' => '2016/10/18 11:56:05', 9 'pub' => '0', 10 ), 11 1 => 12 array ( 13 'uri' => 'https://twitter.com/', 14 'title' => 'Twitter', 15 'note' => '', 16 'tags' => 'ブックマーク バー', 17 'time' => '2016/10/18 11:56:31', 18 'pub' => '0', 19 ), 20 2 => 21 array ( 22 'uri' => 'https://qiita.com/', 23 'title' => 'Qiita', 24 'note' => '', 25 'tags' => 'ブックマーク バー', 26 'time' => '2016/10/18 11:57:14', 27 'pub' => '0', 28 ), 29 3 => 30 array ( 31 'uri' => 'https://www.facebook.com/', 32 'title' => 'Facebook', 33 'note' => '', 34 'tags' => 'ブックマーク バー,フォルダ1', 35 'time' => '2016/10/18 11:58:06', 36 'pub' => '0', 37 ), 38 4 => 39 array ( 40 'uri' => 'https://teratail.com/', 41 'title' => 'teratail【テラテイル】|思考するエンジニアのためのQAプラットフォーム', 42 'note' => '', 43 'tags' => 'ブックマーク バー,フォルダ1,フォルダ2', 44 'time' => '2016/10/18 11:59:04', 45 'pub' => '0', 46 ), 47)

このような配列が与えられた際に,

JSON

1{ 2 "status": "OK", 3 "messages": "File Loaded.", 4 "bookmark": [ 5 { 6 "id": 482, 7 "parent_id": null, 8 "title": "ブックマーク バー", 9 "folder": true, 10 "bookmark": [ 11 { 12 "id": 485, 13 "parent_id": 482, 14 "title": "Google", 15 "detail": "", 16 "reg_date": "2016/10/18 11:56:05", 17 "folder": false, 18 "url": "https://www.google.co.jp/" 19 }, 20 { 21 "id": 486, 22 "parent_id": 482, 23 "title": "Twitter", 24 "detail": "", 25 "reg_date": "2016/10/18 11:56:31", 26 "folder": false, 27 "url": "https://twitter.com/" 28 }, 29303132 ] 33 }, 34 { 35 "id": 483, 36 "parent_id": 482, 37 "title": "フォルダ1", 38 "folder": true, 39 "bookmark": [ 40 { 41 "id": 488, 42 "parent_id": 483, 43 "title": "Facebook", 44 "detail": "", 45 "reg_date": "2016/10/18 11:58:06", 46 "folder": false, 47 "url": "https://www.facebook.com/" 48 } 49 ] 50 }, 51525354 ] 55} 56

このようなツリー構造を持つJSONとして返すというものになります.
JSONが持つIDは,DBから持ってきたIDで,Parent_IDは親ノードのIDとなります.

PHP

1//ブックマークをフォルダ毎に纏める 2 foreach ($bookmarks as $b) { 3 if ($tmpTags === $b['tags']) { 4 continue; 5 } 6 7 $tmpTags = $b['tags']; 8 $i++; 9 10 foreach ($bookmarks as $bookmark) { 11 if ($bookmark['tags'] === $tmpTags) { 12 $bookmarkItems[$i][] = $bookmark; 13 } 14 } 15 } 16 17 //フォルダにIDを付与 18 foreach ($bookmarkItems as $bookmarkItem) { 19 $tags = explode(',', $bookmarkItem[0]['tags']); 20 21 foreach ($tags as $tag) { 22 if (!isset($tagLists[0])) { 23 $tagLists[] = [ 24 'tag' => $tag, 25 'id' => $id, 26 ]; 27 $id++; 28 } else { 29 for ($j = 0; $j < count($tagLists); $j++) { 30 if ($tag === $tagLists[$j]['tag']) { 31 $isFind = true; 32 break; 33 } 34 $isFind = false; 35 } 36 37 if (!$isFind) { 38 $tagLists[] = [ 39 'tag' => $tag, 40 'id' => $id, 41 ]; 42 43 $id++; 44 } 45 } 46 } 47 } 48 49 //['bookmark']に含まれるノードにParentIDを付与する 50 foreach ($bookmarkItems as $bookmarkItem) { 51 $tags = explode(',', $bookmarkItem[0]['tags']); 52 $end = end($tags); 53 foreach ($tags as $tag) { 54 if ($tag === $end) { 55 @$tagPrevValue = $tags[(count($tags) - 2)]; 56 57 if (!is_null($tagPrevValue)) { 58 foreach ($tagLists as $tagList) { 59 if ($tagList['tag'] === $tagPrevValue) { 60 $tagPrevId = $tagList['id']; 61 } 62 } 63 64 for ($i = 0; $i < count($tagLists); $i++) { 65 if ($tagLists[$i]['tag'] === $tag) { 66 $tagLists[$i]['parent_id'] = $tagPrevId; 67 } 68 } 69 } else { 70 for ($i = 0; $i < count($tagLists); $i++) { 71 if ($tagLists[$i]['tag'] === $tag) { 72 $tagLists[$i]['parent_id'] = null; 73 } 74 } 75 } 76 } 77 } 78 } 79 80 //タグの空白要素を消す 81 foreach ($tagLists as $tagList) { 82 if ($tagList['tag'] === '') { 83 unset($tagLists[$tagList['id'] - 1]); 84 } 85 } 86 87 //Folder = trueをもつノードを格納する 88 foreach ($tagLists as $tagList) { 89 $tagListItems[] = [ 90 'id' => $tagList['id'], 91 'parent_id' => $tagList['parent_id'], 92 'title' => $tagList['tag'], 93 'folder' => true 94 ]; 95 } 96 97 $bookmarkJson['bookmark'] = $tagListItems; 98 99 //先に入れたフォルダに対応するノードをParent_IDを付与して纏める 100 foreach ($bookmarkItems as $bookmarkItem) { 101 $tags = explode(',', $bookmarkItem[0]['tags']); 102 103 foreach ($tags as $tag) { 104 if ($tag === end($tags)) { 105 if ($bookmarkItem[0]['tags'] !== '') { 106 if (strstr($bookmarkItem[0]['tags'], $tag)) { 107 foreach ($bookmarkItem as $item) { 108 foreach ($tagLists as $tagList) { 109 if ($tagList['tag'] === $tag) { 110 $parent_id = $tagList['id']; 111 } 112 } 113 114 $bookmarkItemAfter[] = [ 115 'id' => $id, 116 'parent_id' => $parent_id, 117 'title' => $item['title'], 118 'detail' => $item['note'], 119 'reg_date' => $item['time'], 120 'folder' => false, 121 'url' => $item['uri'] 122 ]; 123 124 for ($i = 0; $i < count($bookmarkJson['bookmark']); $i++) { 125 if ($bookmarkJson['bookmark'][$i]['title'] === $tag) { 126 $bookmarkJson['bookmark'][$i]['bookmark'] = $bookmarkItemAfter; 127 $id++; 128 } 129 } 130 } 131 unset($bookmarkItemAfter); 132 } 133 } else { //tag(フォルダ)情報を持っていなかった場合にはParentIDをNULLにして格納 134 foreach ($bookmarkItem as $item) { 135 $bookmarkItemAfter = [ 136 'id' => $id, 137 'parent_id' => null, 138 'title' => $item['title'], 139 'detail' => $item['note'], 140 'reg_date' => $item['time'], 141 'folder' => false, 142 'url' => $item['uri'] 143 ]; 144 145 array_push($bookmarkJson['bookmark'], $bookmarkItemAfter); 146 $id++; 147 } 148 unset($bookmarkItemAfter); 149 } 150 } 151 } 152 } 153 return $bookmarkJson;

現在,上記コードで実現はできているのですが,可読性が皆無なので,スッキリさせる方法があれば教えていただけると幸いです.
よろしくお願いいたします.

###補足情報(言語/FW/ツール等のバージョンなど)
PHP 5.6
Laravel 5.1

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

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

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

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

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

guest

回答2

0

json_encodeを使えば配列をjsonに変換することができますよ。事前に階層なども配列で合わせてから、encodeすればうまくいくと思います。

投稿2016/10/18 03:24

popobot

総合スコア6586

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

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

0

ベストアンサー

Laravelはそのまま配列をreturnしてあげれば勝手に配列をjsonにエンコードしてくれますので、下記コードのように返したいjsonフォーマットそのままの配列を作りコントローラ内などでreturnしてあげればOKです。

$json = [ "status" => "OK", "messages" => "File Loaded.", "bookmark" => [ [ "id" => 482, "parent_id" => null, "title" => "ブックマーク バー", "folder" => true, "bookmark" => [ [ "id" => 485, "parent_id" => 482, "title" => "Google", "detail" => "", "reg_date" => "2016/10/18 11:56:05", "folder" => false, "url" => "https://www.google.co.jp/" ], ・ ・ ・ ]; return $json;

投稿2016/10/18 04:22

編集2016/10/18 04:23
natady

総合スコア606

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問