You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP技术问询:如何获取父子结构数组中的父子对应值

处理PHP父子结构数组,获取父子对应值的几种方法

嘿,我来帮你搞定这个父子数组的问题!针对你给出的这种扁平的父子结构数组,PHP里有好几种实用的方式来获取父子对应关系,我分场景给你列出来:

1. 获取直接父子映射(仅一级子节点)

如果只需要每个父节点对应的直接子节点(比如parent_id=1对应id=3,parent_id=3对应id=5这种),简单遍历就能搞定:

先明确你的原始数组(补全省略部分方便测试):

$originalArray = [
    ['id' => '1', 'job_id' => 'J1', 'parent_id' => '0'],
    ['id' => '2', 'job_id' => 'J2', 'parent_id' => '0'],
    ['id' => '3', 'job_id' => 'J3', 'parent_id' => '1'],
    ['id' => '4', 'job_id' => 'J4', 'parent_id' => '2'],
    ['id' => '5', 'job_id' => 'J5', 'parent_id' => '3'],
    ['id' => '6', 'job_id' => 'J6', 'parent_id' => '3'], // 补全省略的示例项
];

生成直接父子映射的函数:

function getDirectParentChildMap($array) {
    $map = [];
    foreach ($array as $item) {
        $parentId = $item['parent_id'];
        // 初始化父ID对应的子节点数组
        if (!isset($map[$parentId])) {
            $map[$parentId] = [];
        }
        // 将当前节点加入对应父ID的列表
        $map[$parentId][] = $item;
    }
    return $map;
}

// 使用示例:获取parent_id=1的直接子节点
$directMap = getDirectParentChildMap($originalArray);
print_r($directMap['1']);

得到的$directMap中,每个键是父节点ID,值是该父节点的所有直接子节点数组。

2. 根据父ID获取所有后代节点(含嵌套子节点)

如果需要某个父节点下所有层级的子节点(比如parent_id=1对应id=3、5、6),可以用递归或迭代实现:

递归版本(代码简洁,适合层级不深的场景)

function getAllChildrenByParentId($array, $parentId) {
    $children = [];
    foreach ($array as $item) {
        if ($item['parent_id'] == $parentId) {
            // 先加入当前子节点
            $children[] = $item;
            // 递归获取当前子节点的后代,合并结果
            $children = array_merge($children, getAllChildrenByParentId($array, $item['id']));
        }
    }
    return $children;
}

// 使用示例:获取parent_id=1的所有后代
$allChildrenOf1 = getAllChildrenByParentId($originalArray, '1');
print_r($allChildrenOf1);

迭代版本(避免递归栈溢出,适合层级极深的数组)

function getAllChildrenIterative($array, $parentId) {
    $children = [];
    $queue = [$parentId];
    
    while (!empty($queue)) {
        $currentParent = array_shift($queue);
        foreach ($array as $item) {
            if ($item['parent_id'] == $currentParent) {
                $children[] = $item;
                // 将当前子节点ID加入队列,继续查找它的后代
                $queue[] = $item['id'];
            }
        }
    }
    return $children;
}

// 使用示例
$allChildrenOf1 = getAllChildrenIterative($originalArray, '1');
print_r($allChildrenOf1);

3. 构建完整的嵌套树形结构

如果想把扁平数组转成嵌套树形(每个节点包含自己的children数组),后续处理会更直观:

function buildTree($array, $parentId = '0') {
    $tree = [];
    foreach ($array as $item) {
        if ($item['parent_id'] == $parentId) {
            // 递归构建当前节点的子树
            $children = buildTree($array, $item['id']);
            if (!empty($children)) {
                $item['children'] = $children;
            }
            $tree[] = $item;
        }
    }
    return $tree;
}

// 使用示例:构建以parent_id=0为根的完整树形
$tree = buildTree($originalArray);
print_r($tree);

转成树形后,你可以轻松遍历父子关系:比如$tree[0]['children']是J1的直接子节点,$tree[0]['children'][0]['children']是J3的子节点,以此类推。


内容的提问来源于stack exchange,提问作者Aanshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:07:39