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
相关产品推荐
相关产品推荐

