| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 | 
							- <?php
 
- namespace app\common\library;
 
- /**
 
-  * SKU辅助工具类
 
-  */
 
- class SkuHelper
 
- {
 
-     /**
 
-      * 格式化SKU规格属性显示
 
-      * @param string $skuAttr 规格属性JSON字符串,格式:[{"name":"规格名","value":"规格值"}]
 
-      * @return string 格式化后的显示文本
 
-      */
 
-     public static function formatSkuAttr($skuAttr)
 
-     {
 
-         if (empty($skuAttr)) {
 
-             return '';
 
-         }
 
-         
 
-         // 尝试解析JSON格式
 
-         $attrs = json_decode($skuAttr, true);
 
-         if (json_last_error() === JSON_ERROR_NONE && is_array($attrs)) {
 
-             // JSON格式
 
-             $formatted = [];
 
-             foreach ($attrs as $attr) {
 
-                 if (isset($attr['name']) && isset($attr['value'])) {
 
-                     $formatted[] = $attr['name'] . ': ' . $attr['value'];
 
-                 }
 
-             }
 
-             return implode(' | ', $formatted);
 
-         }
 
-         
 
-         // 兼容旧的字符串格式:规格名:规格值,规格名:规格值
 
-         if (strpos($skuAttr, ':') !== false) {
 
-             $attrs = explode(',', $skuAttr);
 
-             $formatted = [];
 
-             foreach ($attrs as $attr) {
 
-                 if (strpos($attr, ':') !== false) {
 
-                     list($name, $value) = explode(':', $attr, 2);
 
-                     $formatted[] = trim($name) . ': ' . trim($value);
 
-                 }
 
-             }
 
-             return implode(' | ', $formatted);
 
-         }
 
-         
 
-         return $skuAttr;
 
-     }
 
-     
 
-     /**
 
-      * 解析SKU规格属性为数组
 
-      * @param string $skuAttr 规格属性字符串
 
-      * @return array 规格属性数组,格式:[['name' => '颜色', '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) . '...';
 
-     }
 
- } 
 
 
  |