質問編集履歴

1

自分なりに考えた方法と、手詰まりになってしまった点について追記しました。

2016/01/25 03:18

投稿

smiley-_-smiley
smiley-_-smiley

スコア26

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,14 @@
1
+ ※丸投げが過ぎるとのご指摘をいただきましたため、質問内容を大幅に編集しております。大変失礼いたしました。
2
+
3
+
4
+
1
- 手元にはメンバーリストと所属という二種類のCSVがあります。
5
+ 手元にはメンバーリストと所属一覧という二種類のCSVがあります。
6
+
2
-
7
+ メンバーリスト上の所属はツリー構造をしており、同じ名称の所属名が複数使用されています。
8
+
9
+
10
+
3
- メンバーリスト所属に対応するIDを振ったリストを作成したいと考えていますが、IDを一致させる方法がどうしてもわかりません
11
+ メンバーリストの所属1』~『所属3』に対応するIDを所属一覧のCSVから検索て、出食したいといます。
4
12
 
5
13
 
6
14
 
@@ -12,9 +20,241 @@
12
20
 
13
21
 
14
22
 
15
-
23
+ 単純にメンバーリスト上の所属Nと所属一覧上の所属名を比較するだけだと
24
+
16
-
25
+ 所属2や3において
26
+
27
+ 1-1>傘係>傘まとめ担当は90
28
+
29
+ 1-2>傘係>傘まとめ担当は190
30
+
31
+ 1-3>傘係>傘まとめ担当は310
32
+
33
+ をそれぞれ返してほしいのに、最初にヒットした90が返ってしまうと考えました。
34
+
35
+
36
+
37
+
38
+
39
+ そこで所属一覧を読み込んだ後にメンバーリスト上の所属1~所属3との比較用として、以下のデータを作成して、一致するIDを取り出そうとしました。
40
+
41
+
42
+
43
+ (1)所属1との比較用データ:'1-1' -> 10
44
+
45
+ (2)所属1+所属2との比較用データ:'1-1|傘係' -> 40
46
+
47
+ (3)所属1+所属2+所属3との比較用データ:'1-1|傘係|傘まとめ担当' -> 90
48
+
49
+
50
+
51
+
52
+
53
+ しかし、比較用のデータを作成しようとしました段階でどのようにすればいいのかわからず、手詰まりになってしまいました。
54
+
55
+ 今回は所属1~所属3の三階層ですが、今後階層が増えることも考えられるため、再帰的にIDと親IDが一致する所属名を一番下の階層から文字列を結合すればいいのかとも思いましたが、単純にループした場合は(1)(2)(3)をそれぞれ作ることができませんでした。
56
+
57
+
58
+
17
- ほぼ丸投げ状態になってしまいますが、どなたかご教示いただけないでしょうか。
59
+ どなたか比較データの作成方法、もしくは考え方についてご教示いただけないでしょうか。
60
+
61
+
62
+
63
+
64
+
65
+ ```php
66
+
67
+ <?php
68
+
69
+ $user_filepath ="user.csv"; //ユーザー一覧
70
+
71
+ $section_filepath = "section.csv"; //所属一覧
72
+
73
+ $output_file = "output.csv";
74
+
75
+
76
+
77
+ $user_list = array();
78
+
79
+ $section_list = array();
80
+
81
+ $output = array();
82
+
83
+
84
+
85
+ //ユーザー一覧を読み込む
86
+
87
+ $user_file = new SplFileObject($user_filepath);
88
+
89
+ $user_file->setFlags(SplFileObject::READ_CSV);
90
+
91
+ $n=0; //先頭行を飛ばすためのカウンタ
92
+
93
+ foreach ($user_file as $line){
94
+
95
+ if($n>0){
96
+
97
+ $user_list[] =array(
98
+
99
+ 'id' => $line[0],
100
+
101
+ 'name' => $line[1],
102
+
103
+ 'section1' => $line[2],
104
+
105
+ 'section2' => $line[3],
106
+
107
+ 'section3' => $line[4],
108
+
109
+ );
110
+
111
+ }
112
+
113
+ $n++;
114
+
115
+ }
116
+
117
+
118
+
119
+ //所属一覧を読み込む
120
+
121
+ $section_file = new SplFileObject($section_filepath);
122
+
123
+ $section_file->setFlags(SplFileObject::READ_CSV);
124
+
125
+ $i=0; //先頭行を飛ばすためのカウンタ
126
+
127
+ foreach ($section_file as $line){
128
+
129
+ if($i>0){
130
+
131
+ $section_list[] = array(
132
+
133
+ 'id' => $line[0],
134
+
135
+ 'section_name' => $line[1],
136
+
137
+ 'parent_id' => $line[2]
138
+
139
+ );
140
+
141
+ }
142
+
143
+ }
144
+
145
+
146
+
147
+
148
+
149
+ print_r($user_list);
150
+
151
+ //print_r($section_list);
152
+
153
+ ```
154
+
155
+
156
+
157
+ ```
158
+
159
+ ●メンバー一覧(user.csv)
160
+
161
+ id,名前,所属1,所属2,所属3
162
+
163
+ 1,山田太郎,1-1,傘係,傘まとめ担当
164
+
165
+ 2,田中一郎,1-1,ごみ係,ゴミ捨て担当
166
+
167
+ 3,杉田玄白,1-2,傘係,傘立て掃除担当
168
+
169
+ 4,高杉晋作,1-3,生き物係,
170
+
171
+ 5,坂本龍馬,1-1,体育係,
172
+
173
+ ```
174
+
175
+
176
+
177
+ ```
178
+
179
+ ●所属一覧(section.csv)
180
+
181
+ id,カテゴリー,親ID
182
+
183
+ 10,1-1,0
184
+
185
+ 20,1-2,0
186
+
187
+ 30,1-3,0
188
+
189
+ 40,傘係,10
190
+
191
+ 50,ごみ係,10
192
+
193
+ 60,生き物係,10
194
+
195
+ 140,体育係,10
196
+
197
+ 150,傘係,20
198
+
199
+ 160,ごみ係,20
200
+
201
+ 170,生き物係,20
202
+
203
+ 180,体育係,20
204
+
205
+ 270,傘係,30
206
+
207
+ 280,ごみ係,30
208
+
209
+ 290,生き物係,30
210
+
211
+ 300,体育係,30
212
+
213
+ 90,傘まとめ担当,40
214
+
215
+ 100,傘立て掃除担当,40
216
+
217
+ 70,ゴミ捨て担当,50
218
+
219
+ 80,ゴミ袋交換担当,50
220
+
221
+ 110,エサやり担当,60
222
+
223
+ 120,水替え担当,60
224
+
225
+ 130,水槽掃除担当,60
226
+
227
+ 190,傘まとめ担当,150
228
+
229
+ 200,傘立て掃除担当,150
230
+
231
+ 210,ゴミ捨て担当,160
232
+
233
+ 220,ゴミ袋交換担当,160
234
+
235
+ 230,エサやり担当,170
236
+
237
+ 240,水替え担当,170
238
+
239
+ 250,水槽掃除担当,170
240
+
241
+ 310,傘まとめ担当,270
242
+
243
+ 320,傘立て掃除担当,270
244
+
245
+ 330,ゴミ捨て担当,280
246
+
247
+ 340,ゴミ袋交換担当,280
248
+
249
+ 350,エサやり担当,290
250
+
251
+ 360,水替え担当,290
252
+
253
+ 370,水槽掃除担当,290
254
+
255
+
256
+
257
+ ```
18
258
 
19
259
 
20
260
 
@@ -28,78 +268,56 @@
28
268
 
29
269
  所属は、同じ名称でも親が異なる場合は別IDが与えられています。
30
270
 
31
- 例)
32
-
33
- 1-1傘係傘まとめ担当→90
34
-
35
- 1-2>係>傘まとめ担当→290
36
-
37
- ※IDの付与ルールに一貫性はありません。
38
-
39
-
40
-
41
-
42
-
43
- ```
44
-
45
- ●メンバー一覧
46
-
47
- id,名前,所属1,所属2,所属3
48
-
49
- 1,山田太郎,1-1,傘係,傘まとめ担当
50
-
51
- 2,田中一郎,1-1,ごみ,ゴミ捨て担当
52
-
53
- 3,杉田玄白,1-2,係,傘立て掃除担当
54
-
55
- 4,高杉晋作,1-3,生き物,
56
-
57
- 5,坂本龍馬,1-1,体育係,
58
-
59
- ```
60
-
61
-
62
-
63
- ```
64
-
65
- 所属一覧
66
-
67
- id,カテゴリー,親ID
68
-
69
- 10,1-1,0
70
-
71
- 20,1-2,0
72
-
73
- 30,1-3,0
74
-
75
- 40,傘係,10
76
-
77
- 50,ごみ,10
78
-
79
- 60,生き物係,10
80
-
81
- 140,体育係,
82
-
83
- 150,傘,20
84
-
85
- 90,傘まとめ担当,40
86
-
87
- 100,傘立て掃除担当,40
88
-
89
- 70,ゴミ捨て担当,50
90
-
91
- 80,ゴミ袋交換担当,50
92
-
93
- 110,エサやり担当,60
94
-
95
- 120,水替え担当,60
96
-
97
- 130,水槽掃除担当,60
98
-
99
- 160,傘まとめ担当,150
100
-
101
- 170,傘立て掃除担当,150
102
-
103
-
104
-
105
- ```
271
+ 例)ID_所属名
272
+
273
+ 10_1-1┬40_傘係┬90_傘まとめ担当
274
+
275
+ │ └100_立て掃除担当
276
+
277
+ └50_ごみ係┬70_ゴミ捨て担当
278
+
279
+ │ └80_ゴミ袋交換担当
280
+
281
+ └60_生き物係┬110_エサやり担当
282
+
283
+ │ └120_水替え担当
284
+
285
+ │ └130_水槽掃除担当
286
+
287
+ 140_体育係
288
+
289
+
290
+
291
+ 20_1-2┬150_傘┬190_傘まとめ担当
292
+
293
+ │ └200_傘立て掃除担当
294
+
295
+ 160_ごみ┬210_ゴミ捨て担当
296
+
297
+ │ └220_ゴミ袋交換担当
298
+
299
+ └170_生き物係┬230_エサやり担当
300
+
301
+ │ └240_水替え担当
302
+
303
+ │ └250_水槽掃除担当
304
+
305
+ └180_体育係
306
+
307
+
308
+
309
+ 30_1-3┬270_傘係┬310_傘まとめ担当
310
+
311
+ │ └320_傘立て掃除担当
312
+
313
+ └280_ごみ係┬330_ゴミ捨て担当
314
+
315
+ │ └340_ゴミ袋交換担当
316
+
317
+ └290_生き物┬350_エサやり担当
318
+
319
+ │ └360_水替え担当
320
+
321
+ │ └370_水槽掃除担当
322
+
323
+ └300_体育