如何将含children_data的嵌套数组扁平化并保留原有键名
需求说明
- 将Magento返回的多层嵌套分类数组(嵌套字段为
children_data)拍平为单层级数组 - 保留所有原始分类字段(id、parent_id、name、is_active、position、level、product_count),仅移除
children_data字段 - 所有子分类和父分类平级放置,后续可直接导出为CSV用于主库分类与Magento分类的匹配校验
PHP实现代码(适配Magento场景)
/** * 拍平Magento嵌套分类数组 * @param array $categories 待处理的嵌套分类数组 * @param array $result 存储拍平后结果的引用数组 */ function flattenCategories(array $categories, array &$result): void { foreach ($categories as $category) { // 提取子分类数据 $children = $category['children_data'] ?? []; // 移除children_data字段后存入结果集 unset($category['children_data']); $result[] = $category; // 递归处理所有子分类 if (!empty($children)) { flattenCategories($children, $result); } } } // 用法示例 // 你从Magento接口获取的原始分类数组 $originalCategory = [ "id" => 2, "parent_id" => 1, "name" => "Category 1", "is_active" => true, "position" => 1, "level" => 1, "product_count" => 1, "children_data" => [ // 此处为你提供的嵌套子分类数据 ] ]; $flattenedCategories = []; // 顶层为单个分类时需包装为数组传入 flattenCategories([$originalCategory], $flattenedCategories);
导出为CSV补充代码
处理完成后可直接导出为CSV文件,方便后续比对使用:
// CSV表头,与分类字段一一对应 $headers = ['分类ID', '父级分类ID', '分类名称', '是否启用', '排序位置', '层级', '关联产品数']; $fp = fopen('magento_categories.csv', 'w'); fputcsv($fp, $headers); foreach ($flattenedCategories as $item) { // 布尔类型转可读性更高的1/0 $item['is_active'] = $item['is_active'] ? 1 : 0; fputcsv($fp, $item); } fclose($fp);
注意事项
- 递归逻辑支持无限层级分类,无论嵌套多少层都可完整拍平
- 所有原始字段信息完整保留,完全满足分类匹配、API导入时的映射需求
- 生成的CSV可直接用表格工具打开,也可直接被脚本读取做自动匹配
内容的提问来源于stack exchange,提问作者Dave Hon
相关产品推荐
相关产品推荐

