※丸投げが過ぎるとのご指摘をいただきましたため、質問内容を大幅に編集しております。大変失礼いたしました。
手元にはメンバーリストと所属一覧という二種類のCSVがあります。
メンバーリスト上の所属はツリー構造をしており、同じ名称の所属名が複数使用されています。
メンバーリストの『所属1』~『所属3』に対応するIDを所属一覧のCSVから検索して、出食したいと思います。
id, 名前, 所属1, 所属2, 所属3
↓
id, 名前, 所属1_id, 所属1, 所属2_id, 所属2, 所属3_id, 所属3
単純にメンバーリスト上の所属Nと所属一覧上の所属名を比較するだけだと
所属2や3において
1-1>傘係>傘まとめ担当は90
1-2>傘係>傘まとめ担当は190
1-3>傘係>傘まとめ担当は310
をそれぞれ返してほしいのに、最初にヒットした90が返ってしまうと考えました。
そこで所属一覧を読み込んだ後にメンバーリスト上の所属1~所属3との比較用として、以下のデータを作成して、一致するIDを取り出そうとしました。
(1)所属1との比較用データ:'1-1' -> 10
(2)所属1+所属2との比較用データ:'1-1|傘係' -> 40
(3)所属1+所属2+所属3との比較用データ:'1-1|傘係|傘まとめ担当' -> 90
しかし、比較用のデータを作成しようとしました段階でどのようにすればいいのかわからず、手詰まりになってしまいました。
今回は所属1~所属3の三階層ですが、今後階層が増えることも考えられるため、再帰的にIDと親IDが一致する所属名を一番下の階層から文字列を結合すればいいのかとも思いましたが、単純にループした場合は(1)(2)(3)をそれぞれ作ることができませんでした。
どなたか比較データの作成方法、もしくは考え方についてご教示いただけないでしょうか。
php
1<?php 2$user_filepath ="user.csv"; //ユーザー一覧 3$section_filepath = "section.csv"; //所属一覧 4$output_file = "output.csv"; 5 6$user_list = array(); 7$section_list = array(); 8$output = array(); 9 10//ユーザー一覧を読み込む 11$user_file = new SplFileObject($user_filepath); 12$user_file->setFlags(SplFileObject::READ_CSV); 13$n=0; //先頭行を飛ばすためのカウンタ 14foreach ($user_file as $line){ 15 if($n>0){ 16 $user_list[] =array( 17 'id' => $line[0], 18 'name' => $line[1], 19 'section1' => $line[2], 20 'section2' => $line[3], 21 'section3' => $line[4], 22 ); 23 } 24 $n++; 25} 26 27//所属一覧を読み込む 28$section_file = new SplFileObject($section_filepath); 29$section_file->setFlags(SplFileObject::READ_CSV); 30$i=0; //先頭行を飛ばすためのカウンタ 31foreach ($section_file as $line){ 32 if($i>0){ 33 $section_list[] = array( 34 'id' => $line[0], 35 'section_name' => $line[1], 36 'parent_id' => $line[2] 37 ); 38 } 39} 40 41 42print_r($user_list); 43//print_r($section_list);
●メンバー一覧(user.csv) id,名前,所属1,所属2,所属3 1,山田太郎,1-1,傘係,傘まとめ担当 2,田中一郎,1-1,ごみ係,ゴミ捨て担当 3,杉田玄白,1-2,傘係,傘立て掃除担当 4,高杉晋作,1-3,生き物係, 5,坂本龍馬,1-1,体育係,
●所属一覧(section.csv) id,カテゴリー,親ID 10,1-1,0 20,1-2,0 30,1-3,0 40,傘係,10 50,ごみ係,10 60,生き物係,10 140,体育係,10 150,傘係,20 160,ごみ係,20 170,生き物係,20 180,体育係,20 270,傘係,30 280,ごみ係,30 290,生き物係,30 300,体育係,30 90,傘まとめ担当,40 100,傘立て掃除担当,40 70,ゴミ捨て担当,50 80,ゴミ袋交換担当,50 110,エサやり担当,60 120,水替え担当,60 130,水槽掃除担当,60 190,傘まとめ担当,150 200,傘立て掃除担当,150 210,ゴミ捨て担当,160 220,ゴミ袋交換担当,160 230,エサやり担当,170 240,水替え担当,170 250,水槽掃除担当,170 310,傘まとめ担当,270 320,傘立て掃除担当,270 330,ゴミ捨て担当,280 340,ゴミ袋交換担当,280 350,エサやり担当,290 360,水替え担当,290 370,水槽掃除担当,290
メンバーリストには各自の所属が記載されていますが、人によって所属1のみであったり、所属1~所属3が埋まっています。
所属は、同じ名称でも親が異なる場合は別IDが与えられています。
例)ID_所属名
10_1-1┬40_傘係┬90_傘まとめ担当
│ └100_傘立て掃除担当
└50_ごみ係┬70_ゴミ捨て担当
│ └80_ゴミ袋交換担当
└60_生き物係┬110_エサやり担当
│ └120_水替え担当
│ └130_水槽掃除担当
└140_体育係
20_1-2┬150_傘係┬190_傘まとめ担当
│ └200_傘立て掃除担当
└160_ごみ係┬210_ゴミ捨て担当
│ └220_ゴミ袋交換担当
└170_生き物係┬230_エサやり担当
│ └240_水替え担当
│ └250_水槽掃除担当
└180_体育係
30_1-3┬270_傘係┬310_傘まとめ担当
│ └320_傘立て掃除担当
└280_ごみ係┬330_ゴミ捨て担当
│ └340_ゴミ袋交換担当
└290_生き物係┬350_エサやり担当
│ └360_水替え担当
│ └370_水槽掃除担当
└300_体育係
回答2件
あなたの回答
tips
プレビュー