• 0
  • 0

同步多级分类实现

2021-11-13 413 0 admin 所属分类:PHP 记录

有一个一键迁移店铺的需求,需要把店铺的商品以及商品分类复制过去

现在分类支持多级分类,这边考虑把递归层级结构改为二维数组循环结构

分类的父ID 为 parent_id 

取店铺分类列表

$cates = getCateByShopId($shop_id);

按照父分类ID分组

$cates = groupsbyid($cates, 'parent_id');

同步分类函数

function syncCates($data, $shop_id)
{
    foreach ($data as $k => &$cates) {
        foreach ($cates as $kk => &$cate) {
            // 插入分类 返回分类ID
            $insert_id = insertCate(
                [
                    'shop_id'     => $shop_id,
                    'name'        => $cate['name'],
                    'goods'       => $cate['goods'],
                    'created_at'  => TIMESTAMP,
                    'parent_id'   => $cate['parent_id'] ? getParentId($data, $cate['parent_id']) : 0,
                ]
                , true);
            // 记录到当前记录集 映射起来 后面需要根据老的分类ID找到新的分类ID
            $cate['new_parent_id'] = $insert_id;
            unset($cate);
        }
        unset($cates);
    }
}

做二维数组遍历每个记录集时需要判断记录集是否有父分类 有的话取父分类,由于是从根节点开始插入,因此该方法适应编辑后修改挪动分类到其他分类的情况

function getParentId(&$data, $parent_id)
{
    $cates = [];
    foreach ($data as $d) {
      // 将按parent_id分组的记录集重新转为二维数组记录索引记录
        $cates = array_merge($cates, $d);
    }
    // 对索引数组按分类ID分组转换为 cate_id => cate_info 结构
    $cates = groupbyid($cates);
    //取老分类ID对应的新分类ID
    return $cates[$parent_id]['new_parent_id'];
}


返回顶部