如何将带children层级的PHP分类树数组自动转换为平铺连续数组
PHP树形嵌套数组转一维平铺数组解决方案
问题原因分析
- 你操作的
Categories_store_tree类的list_of_sections是私有属性,外部无法直接遍历访问,这是原代码返回空数组的核心原因 - 原代码用固定层级的循环写法,只能处理固定3层的结构,无法支持任意层级的分类嵌套,扩展性极差
完整实现代码
// 1. 首先获取原始对象中的私有属性内容(用反射实现,不需要修改原类代码) $reflection = new ReflectionClass($new_tree); $property = $reflection->getProperty('list_of_sections'); $property->setAccessible(true); $originalTree = $property->getValue($new_tree); // 2. 定义递归平铺函数 function flattenTree($node, &$result = []) { // 提取当前节点需要的字段,排除children $result[] = [ 'id' => $node['id'], 'name' => $node['name'], 'parent_id' => $node['parent_id'] ]; // 递归处理子节点 if (!empty($node['children'])) { foreach ($node['children'] as $child) { flattenTree($child, $result); } } return $result; } // 3. 执行平铺得到目标一维数组 $flattened = flattenTree($originalTree); // 4. 把结果塞回新的Categories_store_tree对象 $newObj = new Categories_store_tree(); $reflectionNew = new ReflectionClass($newObj); $propertyNew = $reflectionNew->getProperty('list_of_sections'); $propertyNew->setAccessible(true); $propertyNew->setValue($newObj, $flattened); // 最终$newObj就是你需要的目标结构对象 var_dump($newObj);
代码说明
- 用PHP反射机制操作私有属性,无需修改原有
Categories_store_tree类的代码,兼容性强 - 递归逻辑支持任意层级的分类嵌套,不管子节点有多深都能正确平铺
- 自动排除不需要的
children字段,直接生成目标结构的数组
内容的提问来源于stack exchange,提问作者joseagaleanoc
相关产品推荐
相关产品推荐

