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) . '...';
- }
- }
|