- 创建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