Мои вопросы очень очень похоже на следующее, но у меня есть пара отличий, в том числе написание на PHP.
У меня есть следующие данные в CSV:
firstname,surname,position,manager
John,D,Clerk,Jane D
Bob,B,Clerk,Jane D
Harry,S,Supervisor,Jack W
Jack,W,CEO,
David,B,Cook,Jack W
Jane,D,CTO,
Amy,L,CBO,
Mike,M,Singer,John D
Используя PHP, мне нужно создать массив этих данных в иерархической структуре, в которой записи располагаются под правильной записью менеджера. Запись верхнего уровня обозначается пустым полем «менеджер». Обратите внимание, что может быть более одной записи верхнего уровня. Кроме того, обратите внимание, как данные полностью случайны.
Я пытался преобразовать вышеупомянутую функцию buildtree () в PHP, но она не выглядит корректной. Вот моя попытка, может кто-нибудь объяснить, где я могу пойти не так? Мне кажется, что проблема в том, что когда я передаю массив в buildtree (), он заканчивается, потому что он начинается с «пустого» ключа и, следовательно, не продолжается с рекурсией:
function buildtree($parents,$tree = array(),$parent_id = ''){
$parent = $parents[$parent_id];
if($parent == ''){
return $tree;
}
foreach($parent as $child){
$report = array($child[0].' '.$child[1]);
if(empty($tree)){
$tree = $report;
}
else{
$reports = $tree['reports'];
$reports = array_merge($reports,$report);
}
buildtree($parents,$report,$child[0].' '.$child[1]);
}
return $tree;
}
# something not right about this.# first, build an array of managers
foreach($_SESSION['csv_data'] as $k=>$val){
if($k > 0){
$manager = $val[3];
$heir[$manager]['reports'][$val[0].' '.$val[1]] = '';
}
}$final = buildtree($heir);
echo '<pre>';
print_r($final);
echo '</pre>';
Для справки вот оригинальная функция python buildtree ():
def buildtree(t=None, parent_eid=''):
"""Given a parents lookup structure, construct
a data hierarchy.
"""parent = parents.get(parent_eid, None)
if parent is None:
return t
for eid, name, mid in parent:
report = { 'name': name }
if t is None:
t = report
else:
reports = t.setdefault('reports', [])
reports.append(report)
buildtree(report, eid)
return t
data = buildtree()
Задача ещё не решена.
Других решений пока нет …