'颜色', 'value' => '红色'], ...] */ public static function parseSkuAttr($skuAttr) { if (empty($skuAttr)) { return []; } // 尝试解析JSON格式 $attrs = json_decode($skuAttr, true); if (json_last_error() === JSON_ERROR_NONE && is_array($attrs)) { // 确保每个元素都有name和value字段 $parsed = []; foreach ($attrs as $attr) { if (isset($attr['name']) && isset($attr['value'])) { $parsed[] = [ 'name' => $attr['name'], 'value' => $attr['value'] ]; } } return $parsed; } // 兼容旧的字符串格式 if (strpos($skuAttr, ':') !== false) { $attrs = explode(',', $skuAttr); $parsed = []; foreach ($attrs as $attr) { if (strpos($attr, ':') !== false) { list($name, $value) = explode(':', $attr, 2); $parsed[] = [ 'name' => trim($name), 'value' => trim($value) ]; } } return $parsed; } return []; } /** * 生成SKU规格属性JSON字符串 * @param array $specs 规格数组,格式:[['name' => '颜色', 'value' => '红色'], ...] * @return string 规格属性JSON字符串 */ public static function buildSkuAttr($specs) { if (empty($specs) || !is_array($specs)) { return ''; } $attrs = []; foreach ($specs as $spec) { if (isset($spec['name']) && isset($spec['value']) && !empty($spec['name']) && !empty($spec['value'])) { $attrs[] = [ 'name' => trim($spec['name']), 'value' => trim($spec['value']) ]; } } return !empty($attrs) ? json_encode($attrs, JSON_UNESCAPED_UNICODE) : ''; } /** * 检查SKU规格属性是否匹配 * @param string $skuAttr1 第一个SKU的规格属性 * @param string $skuAttr2 第二个SKU的规格属性 * @return bool 是否匹配 */ public static function isSkuAttrMatch($skuAttr1, $skuAttr2) { if (empty($skuAttr1) && empty($skuAttr2)) { return true; } if (empty($skuAttr1) || empty($skuAttr2)) { return false; } // 解析为统一的数组格式进行比较 $parsed1 = self::parseSkuAttr($skuAttr1); $parsed2 = self::parseSkuAttr($skuAttr2); if (count($parsed1) !== count($parsed2)) { return false; } // 按规格名排序后比较 usort($parsed1, function($a, $b) { return strcmp($a['name'], $b['name']); }); usort($parsed2, function($a, $b) { return strcmp($a['name'], $b['name']); }); for ($i = 0; $i < count($parsed1); $i++) { if ($parsed1[$i]['name'] !== $parsed2[$i]['name'] || $parsed1[$i]['value'] !== $parsed2[$i]['value']) { return false; } } return true; } /** * 获取SKU规格的简短显示文本 * @param string $skuAttr 规格属性字符串 * @param int $maxLength 最大长度 * @return string 简短显示文本 */ public static function getShortSkuAttr($skuAttr, $maxLength = 50) { $formatted = self::formatSkuAttr($skuAttr); if (mb_strlen($formatted) <= $maxLength) { return $formatted; } return mb_substr($formatted, 0, $maxLength - 3) . '...'; } }