PHP+SQL实现数据库标签数据与店铺表列匹配及CSV取值问题
解决方案
核心问题点
explode函数参数使用错误:你代码中explode(",", $lilanteCategory, 0)的第三个参数设置为0时,PHP只会返回包含完整原字符串的单元素数组,完全达不到分割效果,这是你无法得到拆分后标签的直接原因。如果需要拆分所有逗号分隔的内容,直接删除第三个参数即可。- 缺少分类匹配逻辑:当前代码仅分别打印了两个数据源的分类,没有做等值判断的匹配逻辑
- 无CSV写入的相关实现
优化后的实现逻辑
- 先将s表取出的待匹配分类转换为键值对结构,用分类名做键,对应要取的第二列值做值,匹配时用
isset()判断,性能远高于循环遍历比对 - 修正
explode用法拆分tags列的标签字符串 - 匹配成功后直接调用
fputcsv()写入目标文件
修正后代码
public static function findEmpikCategory() { $empik_lilante_categories = MysqlProvider::getEmpikCategory(); $lilante_category_from_empik = []; foreach($empik_lilante_categories as $categories) { // 直接转成键值对,键是分类名,值是对应要取的第二列字段,这里假设你第二列字段叫target_col,自己替换成实际字段名 $lilante_category_from_empik[$categories['lilante_category']] = $categories['target_col']; } return $lilante_category_from_empik; } public static function findLilanteCategory() { // 待匹配的分类键值对 $lilante_category_map = CSVFileGenerator::findEmpikCategory(); // 所有商品的tags数据 $lilante_category_for_offers_products = MysqlProvider::getLilanteCategoryByOffersEmpik(); // 打开CSV文件,路径自己替换 $csv_file = fopen('./output.csv', 'w'); // 写入CSV表头(可选,不需要可以删掉) fputcsv($csv_file, ['匹配分类', '对应取值']); foreach($lilante_category_for_offers_products as $lilanteCategories) { foreach($lilanteCategories as $lilanteCategory) { // 修正explode用法,拆分所有逗号分隔的标签 $tags_arr = explode(",", $lilanteCategory); // 去重+去除两端空白,避免空格导致匹配失败 $tags_arr = array_unique(array_map('trim', $tags_arr)); foreach ($tags_arr as $tag) { // 匹配到存在的分类 if (isset($lilante_category_map[$tag])) { // 写入CSV,第二个参数是要写入的行数组,自己调整内容 fputcsv($csv_file, [ $tag, $lilante_category_map[$tag] ]); // 如果一个标签只需要写一次,匹配到可以直接break当前循环 break; } } } } // 关闭文件句柄 fclose($csv_file); return; }
额外优化建议
如果数据量较大,可以直接在SQL层面完成匹配,不需要全部拉到PHP里处理:
- 可以用
FIND_IN_SET函数直接完成tags字段和s表分类的匹配,查询效率更高 - 过滤完直接导出SQL查询结果为CSV,省去PHP循环处理的开销
内容的提问来源于stack exchange,提问作者Kasia13130
相关产品推荐
相关产品推荐

