【问题标题】:How do I create a multi-dimensional array with a recursive function in PHP?如何在 PHP 中创建具有递归函数的多维数组?
【发布时间】:2026-02-05 04:00:01
【问题描述】:

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

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>";
    }
}

这将打印出一个漂亮的经理->员工树:

  • 约翰
      • 保罗
      • 玛丽亚
      • 马克
    • 托尼
    • 布兰
  • 科琳
    • 罗克西
    • 狐狸精
  • 礼来
  • 莫琳

但我想要的是递归函数来返回一个带有员工树的多维数组,如下所示:

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
        )
    )

)

这可能吗?

【问题讨论】:

  • 是的,这是可能的,但需要一些工作。你试过什么?
  • 我尝试了太多要记住的事情。我能得到的最好的结果是一个大的平面阵列,所有的 emps 都按顺序排列,但不是一个合适的多暗阵列。我想我在通过递归函数时很难理解数组和子数组的范围。
  • 您知道,只要立即阅读此内容,我认为,完成此任务的最简单方法不一定是递归。对数据库的所有拉取对于入侵都是危险的。您可以尝试两次拉动您的数据库。 1.拉所有经理。 2. 拉动所有员工。然后创建一个空的多维数组并将每个经理推送到 [i][] 并为每个员工(如果他们向经理报告)推送 [i][j]。这有意义吗?
  • 要构建这样的数组,最好知道查询结果数组是如何在里面。你能var_dump它并展示它的结构吗?
  • 为什么在循环中使用 $i 变量和条件语句?它们都将永远等于 true。

标签: php recursion multidimensional-array


【解决方案1】:

构建员工树的递归函数如下。请记住,这不是很有效,因此如果您有一棵由数百/数千名员工组成的树,请不要指望它会特别高效。

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
            )
        ];
    }
}

此代码运行的示例是available here

【讨论】: