如何优化服装尺码多类型识别的多条件判定算法?
优化方案
核心优化方向:将互斥的尺码判断逻辑拆分为独立的单职责函数,按优先级顺序判断类型,彻底消除多层嵌套,同时支持提前终止判断提升性能。
预设规则(完全对齐需求)
- 无尺码:尺码数组为空,优先级最高
- 区间型:所有尺码包含
-连接符 - 文字型:所有尺码属于预设字母尺码白名单
- 数值型:所有尺码匹配数值/分数/英寸格式正则
- 长文本型:所有尺码包含不区分大小写的
size关键词
实现代码
// 可单独维护的配置常量,后续调整规则不需要修改主逻辑 const TEXTUAL_SIZE_LIST = ['3XS', '2XS', 'XXXS', 'XXS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', 'XXXL', '2XL', '3XL']; const NUMERIC_SIZE_PATTERN = '/^\d+(?:\.\d+)?(?: \d+\/\d+)?(?:''|")?$/'; /** * 判断单条尺码是否为区间型 */ function isRangeSize(string $size): bool { return strpos($size, '-') !== false; } /** * 判断单条尺码是否为文字型 */ function isTextualSize(string $size): bool { return in_array($size, TEXTUAL_SIZE_LIST); } /** * 判断单条尺码是否为数值型 */ function isNumericSize(string $size): bool { return preg_match(NUMERIC_SIZE_PATTERN, $size) === 1; } /** * 判断单条尺码是否为长文本型 */ function isVerboseSize(string $size): bool { return stripos($size, 'size') !== false; } /** * 识别单款产品的尺码类型 * @param array $sizes 产品尺码数组 * @return string 类型标识:range/textual/numeric/verbose/sizeless/unknown */ function detectSizeType(array $sizes): string { // 优先判断无尺码 if (empty($sizes)) { return 'sizeless'; } // 单轮遍历统计各类型匹配次数,适合尺码数量多的场景,性能更优 $total = count($sizes); $match = [ 'range' => 0, 'textual' => 0, 'numeric' => 0, 'verbose' => 0 ]; foreach ($sizes as $size) { isRangeSize($size) && $match['range']++; isTextualSize($size) && $match['textual']++; isNumericSize($size) && $match['numeric']++; isVerboseSize($size) && $match['verbose']++; } // 按优先级返回匹配所有尺码的类型 if ($match['range'] === $total) return 'range'; if ($match['textual'] === $total) return 'textual'; if ($match['numeric'] === $total) return 'numeric'; if ($match['verbose'] === $total) return 'verbose'; // 兜底逻辑,可根据业务需求调整 return 'unknown'; } // 主逻辑调用示例 foreach ($products as $prod) { $prodSizeType = detectSizeType($prod['sizes']); // 后续根据类型做对应排序处理即可 }
优化优势
- 可读性强:每个函数仅处理单一判断逻辑,规则调整仅需要修改对应函数,不需要改动嵌套结构
- 性能更优:仅遍历1次尺码数组即可完成所有类型的匹配统计,无多余遍历
- 易维护:白名单、正则都抽为独立常量,后续新增尺码规则不需要改主流程代码
- 易用性高:直接返回类型标识字符串,比原方案的4个布尔变量更便于后续逻辑判断
内容的提问来源于stack exchange,提问作者Faye D.
相关产品推荐
相关产品推荐

