teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

H27\.10\.18 15:30 追記

2016/10/18 06:30

投稿

Sorarinu
Sorarinu

スコア23

title CHANGED
File without changes
body CHANGED
@@ -83,15 +83,9 @@
83
83
  "folder": false,
84
84
  "url": "https://twitter.com/"
85
85
  },
86
- {
86
+
87
- "id": 487,
88
- "parent_id": 482,
89
- "title": "Qiita",
90
- "detail": "",
91
- "reg_date": "2016/10/18 11:57:14",
92
- "folder": false,
93
- "url": "https://qiita.com/"
94
- }
87
+
88
+
95
89
  ]
96
90
  },
97
91
  {
@@ -111,23 +105,9 @@
111
105
  }
112
106
  ]
113
107
  },
114
- {
108
+
115
- "id": 484,
116
- "parent_id": 483,
117
- "title": "フォルダ2",
118
- "folder": true,
119
- "bookmark": [
120
- {
109
+
121
- "id": 489,
122
- "parent_id": 484,
123
- "title": "teratail【テラテイル】|思考するエンジニアのためのQAプラットフォーム",
124
- "detail": "",
125
- "reg_date": "2016/10/18 11:59:04",
126
- "folder": false,
127
- "url": "https://teratail.com/"
128
- }
110
+
129
- ]
130
- }
131
111
  ]
132
112
  }
133
113
 
@@ -136,7 +116,164 @@
136
116
  このようなツリー構造を持つJSONとして返すというものになります.
137
117
  JSONが持つIDは,DBから持ってきたIDで,Parent_IDは親ノードのIDとなります.
138
118
 
119
+
120
+ ```PHP
121
+ //ブックマークをフォルダ毎に纏める
122
+ foreach ($bookmarks as $b) {
123
+ if ($tmpTags === $b['tags']) {
124
+ continue;
125
+ }
126
+
127
+ $tmpTags = $b['tags'];
128
+ $i++;
129
+
130
+ foreach ($bookmarks as $bookmark) {
131
+ if ($bookmark['tags'] === $tmpTags) {
132
+ $bookmarkItems[$i][] = $bookmark;
133
+ }
134
+ }
135
+ }
136
+
137
+ //フォルダにIDを付与
138
+ foreach ($bookmarkItems as $bookmarkItem) {
139
+ $tags = explode(',', $bookmarkItem[0]['tags']);
140
+
141
+ foreach ($tags as $tag) {
142
+ if (!isset($tagLists[0])) {
143
+ $tagLists[] = [
144
+ 'tag' => $tag,
145
+ 'id' => $id,
146
+ ];
147
+ $id++;
148
+ } else {
149
+ for ($j = 0; $j < count($tagLists); $j++) {
150
+ if ($tag === $tagLists[$j]['tag']) {
151
+ $isFind = true;
152
+ break;
153
+ }
154
+ $isFind = false;
155
+ }
156
+
157
+ if (!$isFind) {
158
+ $tagLists[] = [
159
+ 'tag' => $tag,
160
+ 'id' => $id,
161
+ ];
162
+
163
+ $id++;
164
+ }
165
+ }
166
+ }
167
+ }
168
+
169
+ //['bookmark']に含まれるノードにParentIDを付与する
170
+ foreach ($bookmarkItems as $bookmarkItem) {
171
+ $tags = explode(',', $bookmarkItem[0]['tags']);
172
+ $end = end($tags);
173
+ foreach ($tags as $tag) {
174
+ if ($tag === $end) {
175
+ @$tagPrevValue = $tags[(count($tags) - 2)];
176
+
177
+ if (!is_null($tagPrevValue)) {
178
+ foreach ($tagLists as $tagList) {
179
+ if ($tagList['tag'] === $tagPrevValue) {
180
+ $tagPrevId = $tagList['id'];
181
+ }
182
+ }
183
+
184
+ for ($i = 0; $i < count($tagLists); $i++) {
185
+ if ($tagLists[$i]['tag'] === $tag) {
186
+ $tagLists[$i]['parent_id'] = $tagPrevId;
187
+ }
188
+ }
189
+ } else {
190
+ for ($i = 0; $i < count($tagLists); $i++) {
191
+ if ($tagLists[$i]['tag'] === $tag) {
192
+ $tagLists[$i]['parent_id'] = null;
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
+ }
199
+
139
- 何か良い方法があればお教えいただければ幸いで
200
+ //タグの空白要素を消
201
+ foreach ($tagLists as $tagList) {
202
+ if ($tagList['tag'] === '') {
203
+ unset($tagLists[$tagList['id'] - 1]);
204
+ }
205
+ }
206
+
207
+ //Folder = trueをもつノードを格納する
208
+ foreach ($tagLists as $tagList) {
209
+ $tagListItems[] = [
210
+ 'id' => $tagList['id'],
211
+ 'parent_id' => $tagList['parent_id'],
212
+ 'title' => $tagList['tag'],
213
+ 'folder' => true
214
+ ];
215
+ }
216
+
217
+ $bookmarkJson['bookmark'] = $tagListItems;
218
+
219
+ //先に入れたフォルダに対応するノードをParent_IDを付与して纏める
220
+ foreach ($bookmarkItems as $bookmarkItem) {
221
+ $tags = explode(',', $bookmarkItem[0]['tags']);
222
+
223
+ foreach ($tags as $tag) {
224
+ if ($tag === end($tags)) {
225
+ if ($bookmarkItem[0]['tags'] !== '') {
226
+ if (strstr($bookmarkItem[0]['tags'], $tag)) {
227
+ foreach ($bookmarkItem as $item) {
228
+ foreach ($tagLists as $tagList) {
229
+ if ($tagList['tag'] === $tag) {
230
+ $parent_id = $tagList['id'];
231
+ }
232
+ }
233
+
234
+ $bookmarkItemAfter[] = [
235
+ 'id' => $id,
236
+ 'parent_id' => $parent_id,
237
+ 'title' => $item['title'],
238
+ 'detail' => $item['note'],
239
+ 'reg_date' => $item['time'],
240
+ 'folder' => false,
241
+ 'url' => $item['uri']
242
+ ];
243
+
244
+ for ($i = 0; $i < count($bookmarkJson['bookmark']); $i++) {
245
+ if ($bookmarkJson['bookmark'][$i]['title'] === $tag) {
246
+ $bookmarkJson['bookmark'][$i]['bookmark'] = $bookmarkItemAfter;
247
+ $id++;
248
+ }
249
+ }
250
+ }
251
+ unset($bookmarkItemAfter);
252
+ }
253
+ } else { //tag(フォルダ)情報を持っていなかった場合にはParentIDをNULLにして格納
254
+ foreach ($bookmarkItem as $item) {
255
+ $bookmarkItemAfter = [
256
+ 'id' => $id,
257
+ 'parent_id' => null,
258
+ 'title' => $item['title'],
259
+ 'detail' => $item['note'],
260
+ 'reg_date' => $item['time'],
261
+ 'folder' => false,
262
+ 'url' => $item['uri']
263
+ ];
264
+
265
+ array_push($bookmarkJson['bookmark'], $bookmarkItemAfter);
266
+ $id++;
267
+ }
268
+ unset($bookmarkItemAfter);
269
+ }
270
+ }
271
+ }
272
+ }
273
+ return $bookmarkJson;
274
+ ```
275
+
276
+ 現在,上記コードで実現はできているのですが,可読性が皆無なので,スッキリさせる方法があれば教えていただけると幸いです.
140
277
  よろしくお願いいたします.
141
278
 
142
279
  ###補足情報(言語/FW/ツール等のバージョンなど)