有一个一键迁移店铺的需求,需要把店铺的商品以及商品分类复制过去
现在分类支持多级分类,这边考虑把递归层级结构改为二维数组循环结构
分类的父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'];
}