- 创建TreeHelper类实现数组到树形结构的转换功能 - 实现基于ID和父ID的层级关系构建算法 - 添加测试数据验证多层级嵌套结构的正确性 - 包含根节点、子节点及深层级节点的断言测试 - 验证树形结构转换的完整性和准确性 - 为AOT编译环境跳过不支持的功能测试pull/1/head
parent
2ad8df01da
commit
53958c67c3
1 changed files with 99 additions and 0 deletions
@ -0,0 +1,99 @@ |
||||
--TEST-- |
||||
ref 001 |
||||
--SKIPIF-- |
||||
<?php |
||||
exit("skip: not supported in AOT"); |
||||
?> |
||||
--FILE-- |
||||
<?php |
||||
|
||||
class TreeHelper |
||||
{ |
||||
public static function toTree(array $array, $idKey = 'id', $parentKey = 'pid', $childrenKey = 'children') |
||||
{ |
||||
$tree = []; |
||||
$references = []; |
||||
|
||||
// 第一次遍历:创建所有节点的引用 |
||||
foreach ($array as &$node) { |
||||
$node[$childrenKey] = []; // 初始化children |
||||
$references[$node[$idKey]] = &$node; |
||||
} |
||||
unset($node); |
||||
|
||||
// 第二次遍历:构建树 |
||||
foreach ($array as &$node) { |
||||
$parentId = $node[$parentKey]; |
||||
|
||||
if (empty($parentId) || !isset($references[$parentId])) { |
||||
// 根节点或父节点不存在 |
||||
$tree[] = &$node; |
||||
} else { |
||||
// 子节点 |
||||
$references[$parentId][$childrenKey][] = &$node; |
||||
} |
||||
} |
||||
unset($node); |
||||
|
||||
return $tree; |
||||
} |
||||
} |
||||
|
||||
function main() |
||||
{ |
||||
// 测试数据 |
||||
$list = [ |
||||
['id' => 1, 'pid' => 0, 'name' => '中国'], |
||||
['id' => 2, 'pid' => 1, 'name' => '广东省'], |
||||
['id' => 3, 'pid' => 1, 'name' => '浙江省'], |
||||
['id' => 4, 'pid' => 2, 'name' => '广州市'], |
||||
['id' => 5, 'pid' => 2, 'name' => '深圳市'], |
||||
['id' => 6, 'pid' => 3, 'name' => '杭州市'], |
||||
['id' => 7, 'pid' => 0, 'name' => '美国'], |
||||
['id' => 8, 'pid' => 7, 'name' => '加州'], |
||||
['id' => 9, 'pid' => 8, 'name' => '旧金山'], |
||||
]; |
||||
|
||||
// 调用 |
||||
$tree = TreeHelper::toTree($list); |
||||
|
||||
// 打印结果 |
||||
echo "生成的树结构:\n"; |
||||
print_r($tree); |
||||
|
||||
// 简单断言测试 |
||||
echo "\n开始断言测试...\n"; |
||||
|
||||
// 根节点应该有 2 个:中国、美国 |
||||
assert(count($tree) === 2); |
||||
|
||||
// 第一个根节点是中国 |
||||
assert($tree[0]['name'] === '中国'); |
||||
|
||||
// 中国下面应该有两个省 |
||||
assert(count($tree[0]['children']) === 2); |
||||
assert($tree[0]['children'][0]['name'] === '广东省'); |
||||
assert($tree[0]['children'][1]['name'] === '浙江省'); |
||||
|
||||
// 广东省下面应该有两个城市 |
||||
assert(count($tree[0]['children'][0]['children']) === 2); |
||||
assert($tree[0]['children'][0]['children'][0]['name'] === '广州市'); |
||||
assert($tree[0]['children'][0]['children'][1]['name'] === '深圳市'); |
||||
|
||||
// 浙江省下面应该有一个城市 |
||||
assert(count($tree[0]['children'][1]['children']) === 1); |
||||
assert($tree[0]['children'][1]['children'][0]['name'] === '杭州市'); |
||||
|
||||
// 第二个根节点是美国 |
||||
assert($tree[1]['name'] === '美国'); |
||||
|
||||
// 美国 -> 加州 -> 旧金山 |
||||
assert(count($tree[1]['children']) === 1); |
||||
assert($tree[1]['children'][0]['name'] === '加州'); |
||||
assert(count($tree[1]['children'][0]['children']) === 1); |
||||
assert($tree[1]['children'][0]['children'][0]['name'] === '旧金山'); |
||||
|
||||
echo "DONE\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
Loading…
Reference in new issue