質問編集履歴
1
自分なりに考えた方法と、手詰まりになってしまった点について追記しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,26 +1,83 @@
|
|
1
|
-
手元にはメンバーリストと所属という二種類のCSVがあります。
|
2
|
-
|
1
|
+
※丸投げが過ぎるとのご指摘をいただきましたため、質問内容を大幅に編集しております。大変失礼いたしました。
|
3
2
|
|
3
|
+
手元にはメンバーリストと所属一覧という二種類のCSVがあります。
|
4
|
+
メンバーリスト上の所属はツリー構造をしており、同じ名称の所属名が複数使用されています。
|
5
|
+
|
6
|
+
メンバーリストの『所属1』~『所属3』に対応するIDを所属一覧のCSVから検索して、出食したいと思います。
|
7
|
+
|
4
8
|
id, 名前, 所属1, 所属2, 所属3
|
5
9
|
↓
|
6
10
|
id, 名前, 所属1_id, 所属1, 所属2_id, 所属2, 所属3_id, 所属3
|
7
11
|
|
12
|
+
単純にメンバーリスト上の所属Nと所属一覧上の所属名を比較するだけだと
|
13
|
+
所属2や3において
|
14
|
+
1-1>傘係>傘まとめ担当は90
|
15
|
+
1-2>傘係>傘まとめ担当は190
|
16
|
+
1-3>傘係>傘まとめ担当は310
|
17
|
+
をそれぞれ返してほしいのに、最初にヒットした90が返ってしまうと考えました。
|
8
18
|
|
9
|
-
ほぼ丸投げ状態になってしまいますが、どなたかご教示いただけないでしょうか。
|
10
19
|
|
20
|
+
そこで所属一覧を読み込んだ後にメンバーリスト上の所属1~所属3との比較用として、以下のデータを作成して、一致するIDを取り出そうとしました。
|
11
21
|
|
22
|
+
(1)所属1との比較用データ:'1-1' -> 10
|
23
|
+
(2)所属1+所属2との比較用データ:'1-1|傘係' -> 40
|
24
|
+
(3)所属1+所属2+所属3との比較用データ:'1-1|傘係|傘まとめ担当' -> 90
|
12
25
|
|
13
|
-
メンバーリストには各自の所属が記載されていますが、人によって所属1のみであったり、所属1~所属3が埋まっています。
|
14
26
|
|
15
|
-
|
27
|
+
しかし、比較用のデータを作成しようとしました段階でどのようにすればいいのかわからず、手詰まりになってしまいました。
|
16
|
-
例)
|
17
|
-
1-1>傘係>傘まとめ担当→90
|
18
|
-
1-2>傘係>傘まとめ担当→290
|
19
|
-
|
28
|
+
今回は所属1~所属3の三階層ですが、今後階層が増えることも考えられるため、再帰的にIDと親IDが一致する所属名を一番下の階層から文字列を結合すればいいのかとも思いましたが、単純にループした場合は(1)(2)(3)をそれぞれ作ることができませんでした。
|
20
29
|
|
30
|
+
どなたか比較データの作成方法、もしくは考え方についてご教示いただけないでしょうか。
|
21
31
|
|
32
|
+
|
33
|
+
```php
|
34
|
+
<?php
|
35
|
+
$user_filepath ="user.csv"; //ユーザー一覧
|
36
|
+
$section_filepath = "section.csv"; //所属一覧
|
37
|
+
$output_file = "output.csv";
|
38
|
+
|
39
|
+
$user_list = array();
|
40
|
+
$section_list = array();
|
41
|
+
$output = array();
|
42
|
+
|
43
|
+
//ユーザー一覧を読み込む
|
44
|
+
$user_file = new SplFileObject($user_filepath);
|
45
|
+
$user_file->setFlags(SplFileObject::READ_CSV);
|
46
|
+
$n=0; //先頭行を飛ばすためのカウンタ
|
47
|
+
foreach ($user_file as $line){
|
48
|
+
if($n>0){
|
49
|
+
$user_list[] =array(
|
50
|
+
'id' => $line[0],
|
51
|
+
'name' => $line[1],
|
52
|
+
'section1' => $line[2],
|
53
|
+
'section2' => $line[3],
|
54
|
+
'section3' => $line[4],
|
55
|
+
);
|
56
|
+
}
|
57
|
+
$n++;
|
58
|
+
}
|
59
|
+
|
60
|
+
//所属一覧を読み込む
|
61
|
+
$section_file = new SplFileObject($section_filepath);
|
62
|
+
$section_file->setFlags(SplFileObject::READ_CSV);
|
63
|
+
$i=0; //先頭行を飛ばすためのカウンタ
|
64
|
+
foreach ($section_file as $line){
|
65
|
+
if($i>0){
|
66
|
+
$section_list[] = array(
|
67
|
+
'id' => $line[0],
|
68
|
+
'section_name' => $line[1],
|
69
|
+
'parent_id' => $line[2]
|
70
|
+
);
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
|
75
|
+
print_r($user_list);
|
76
|
+
//print_r($section_list);
|
22
77
|
```
|
78
|
+
|
79
|
+
```
|
23
|
-
●メンバー一覧
|
80
|
+
●メンバー一覧(user.csv)
|
24
81
|
id,名前,所属1,所属2,所属3
|
25
82
|
1,山田太郎,1-1,傘係,傘まとめ担当
|
26
83
|
2,田中一郎,1-1,ごみ係,ゴミ捨て担当
|
@@ -30,7 +87,7 @@
|
|
30
87
|
```
|
31
88
|
|
32
89
|
```
|
33
|
-
所属一覧
|
90
|
+
●所属一覧(section.csv)
|
34
91
|
id,カテゴリー,親ID
|
35
92
|
10,1-1,0
|
36
93
|
20,1-2,0
|
@@ -38,8 +95,15 @@
|
|
38
95
|
40,傘係,10
|
39
96
|
50,ごみ係,10
|
40
97
|
60,生き物係,10
|
41
|
-
140,体育係,
|
98
|
+
140,体育係,10
|
42
99
|
150,傘係,20
|
100
|
+
160,ごみ係,20
|
101
|
+
170,生き物係,20
|
102
|
+
180,体育係,20
|
103
|
+
270,傘係,30
|
104
|
+
280,ごみ係,30
|
105
|
+
290,生き物係,30
|
106
|
+
300,体育係,30
|
43
107
|
90,傘まとめ担当,40
|
44
108
|
100,傘立て掃除担当,40
|
45
109
|
70,ゴミ捨て担当,50
|
@@ -47,7 +111,52 @@
|
|
47
111
|
110,エサやり担当,60
|
48
112
|
120,水替え担当,60
|
49
113
|
130,水槽掃除担当,60
|
50
|
-
|
114
|
+
190,傘まとめ担当,150
|
51
|
-
|
115
|
+
200,傘立て掃除担当,150
|
116
|
+
210,ゴミ捨て担当,160
|
117
|
+
220,ゴミ袋交換担当,160
|
118
|
+
230,エサやり担当,170
|
119
|
+
240,水替え担当,170
|
120
|
+
250,水槽掃除担当,170
|
121
|
+
310,傘まとめ担当,270
|
122
|
+
320,傘立て掃除担当,270
|
123
|
+
330,ゴミ捨て担当,280
|
124
|
+
340,ゴミ袋交換担当,280
|
125
|
+
350,エサやり担当,290
|
126
|
+
360,水替え担当,290
|
127
|
+
370,水槽掃除担当,290
|
52
128
|
|
53
|
-
```
|
129
|
+
```
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
メンバーリストには各自の所属が記載されていますが、人によって所属1のみであったり、所属1~所属3が埋まっています。
|
134
|
+
|
135
|
+
所属は、同じ名称でも親が異なる場合は別IDが与えられています。
|
136
|
+
例)ID_所属名
|
137
|
+
10_1-1┬40_傘係┬90_傘まとめ担当
|
138
|
+
│ └100_傘立て掃除担当
|
139
|
+
└50_ごみ係┬70_ゴミ捨て担当
|
140
|
+
│ └80_ゴミ袋交換担当
|
141
|
+
└60_生き物係┬110_エサやり担当
|
142
|
+
│ └120_水替え担当
|
143
|
+
│ └130_水槽掃除担当
|
144
|
+
└140_体育係
|
145
|
+
|
146
|
+
20_1-2┬150_傘係┬190_傘まとめ担当
|
147
|
+
│ └200_傘立て掃除担当
|
148
|
+
└160_ごみ係┬210_ゴミ捨て担当
|
149
|
+
│ └220_ゴミ袋交換担当
|
150
|
+
└170_生き物係┬230_エサやり担当
|
151
|
+
│ └240_水替え担当
|
152
|
+
│ └250_水槽掃除担当
|
153
|
+
└180_体育係
|
154
|
+
|
155
|
+
30_1-3┬270_傘係┬310_傘まとめ担当
|
156
|
+
│ └320_傘立て掃除担当
|
157
|
+
└280_ごみ係┬330_ゴミ捨て担当
|
158
|
+
│ └340_ゴミ袋交換担当
|
159
|
+
└290_生き物係┬350_エサやり担当
|
160
|
+
│ └360_水替え担当
|
161
|
+
│ └370_水槽掃除担当
|
162
|
+
└300_体育係
|