在PHP中,基于随机关系数据的分层结构数组?

在PHP中,基于随机关系数据的分层结构数组?,php,python,csv,hierarchy,hierarchical-data,Php,Python,Csv,Hierarchy,Hierarchical Data,我的问题非常类似于下面的问题,但我有几个不同之处,包括用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,我需要在一个Hierarchical结

我的问题非常类似于下面的问题,但我有几个不同之处,包括用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,我需要在一个Hierarchical结构中创建一个数据数组,其中记录位于正确的管理器记录下。顶层记录由空白的“管理者”字段表示。请注意如何可以有多个顶级记录。此外,请注意数据是如何完全随机的

我试图在PHP中转换上面的buildtree()函数,但它似乎不正确。这是我的尝试,有人能解释一下我可能出了什么问题吗?我似乎遇到的问题是,当我将数组传递给buildtree()时,它的结尾是因为它以“blank”键开始,因此它不会继续递归:

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>';
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()