如何在PHP中使用递归函数创建多维数组



我有一个雇员表,其中一些雇员是经理。我需要一个函数,它接受一个员工ID,并创建一个多dim数组,其中包含向他们报告的所有员工。到目前为止,我能够打印树:

function drillDownStaff($emplid){
    $conn = db_connect();
    $sql = "SELECT
            employees.EmployeeID, employees.ManagerID
        FROM
            employees
        WHERE
            employees.ManagerID = '".$emplid."';
    $result = mysql_query($sql,$conn);
    while($row = mysql_fetch_assoc($result)){
        echo "<ul>";
        echo "<li>".$row['FullName'];
        drillDownStaff($row['EmployeeID']);
        echo "</li>";
        echo "</ul>";
    }
}

这将打印出一个nice manager->employee树:

  • 约翰
      • 保罗
      • 玛丽亚
      • 标记
    • 托尼
    • 布莱恩
  • 科琳
    • 罗克西
    • 狡猾的
  • 莉莉
  • 莫林

但是我想要的是递归函数,以返回员工树的多dim数组,如下所示:

array(
    [5] => array(
        [FullName] => John
        [...] => Other emp details
        [manages] => array(
            [6]=>array(
                [FullName]=>Jane
                [...]=>other emp details
                [manages]=> array(Pauls' details)
            )
            [7]=>array(...) // emp details again
        )
    )
)

这可能吗?

构建人员树的递归函数如下所示。请记住,这不是很有效,所以如果您有一个由数百/数千名员工组成的树,请不要期望它具有特别的性能。

function buildStaffTree($managerId = null) {
    global $staff;
    $subordinates = array_values(array_filter(
        $staff,
        function ($staffMember) use ($managerId) {
            return $staffMember['manager'] === $managerId;
        }
    ));
    if ($managerId === null) {
        // Tree root - only enumerate the top-level managers
        return array_map(
            function ($subordinate) {
                return buildStaffTree($subordinate['id']);
            },
            $subordinates
        );
    } else {
        $manager = array_values(array_filter(
            $staff,
            function ($staffMember) use ($managerId) {
                return $staffMember['id'] === $managerId;
            }
        ))[0];
        return [
            'id'      => $manager['id'],
            'name'    => $manager['name'],
            'manages' => array_map(
                function ($subordinate) {
                    return buildStaffTree($subordinate['id']);
                },
                $subordinates
            )
        ];
    }
}

可以在这里找到该代码运行的示例:

最新更新