SkuHelper.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. namespace app\common\library;
  3. /**
  4. * SKU辅助工具类
  5. */
  6. class SkuHelper
  7. {
  8. /**
  9. * 格式化SKU规格属性显示
  10. * @param string $skuAttr 规格属性JSON字符串,格式:[{"name":"规格名","value":"规格值"}]
  11. * @return string 格式化后的显示文本
  12. */
  13. public static function formatSkuAttr($skuAttr)
  14. {
  15. if (empty($skuAttr)) {
  16. return '';
  17. }
  18. // 尝试解析JSON格式
  19. $attrs = json_decode($skuAttr, true);
  20. if (json_last_error() === JSON_ERROR_NONE && is_array($attrs)) {
  21. // JSON格式
  22. $formatted = [];
  23. foreach ($attrs as $attr) {
  24. if (isset($attr['name']) && isset($attr['value'])) {
  25. $formatted[] = $attr['name'] . ': ' . $attr['value'];
  26. }
  27. }
  28. return implode(' | ', $formatted);
  29. }
  30. // 兼容旧的字符串格式:规格名:规格值,规格名:规格值
  31. if (strpos($skuAttr, ':') !== false) {
  32. $attrs = explode(',', $skuAttr);
  33. $formatted = [];
  34. foreach ($attrs as $attr) {
  35. if (strpos($attr, ':') !== false) {
  36. list($name, $value) = explode(':', $attr, 2);
  37. $formatted[] = trim($name) . ': ' . trim($value);
  38. }
  39. }
  40. return implode(' | ', $formatted);
  41. }
  42. return $skuAttr;
  43. }
  44. /**
  45. * 解析SKU规格属性为数组
  46. * @param string $skuAttr 规格属性字符串
  47. * @return array 规格属性数组,格式:[['name' => '颜色', 'value' => '红色'], ...]
  48. */
  49. public static function parseSkuAttr($skuAttr)
  50. {
  51. if (empty($skuAttr)) {
  52. return [];
  53. }
  54. // 尝试解析JSON格式
  55. $attrs = json_decode($skuAttr, true);
  56. if (json_last_error() === JSON_ERROR_NONE && is_array($attrs)) {
  57. // 确保每个元素都有name和value字段
  58. $parsed = [];
  59. foreach ($attrs as $attr) {
  60. if (isset($attr['name']) && isset($attr['value'])) {
  61. $parsed[] = [
  62. 'name' => $attr['name'],
  63. 'value' => $attr['value']
  64. ];
  65. }
  66. }
  67. return $parsed;
  68. }
  69. // 兼容旧的字符串格式
  70. if (strpos($skuAttr, ':') !== false) {
  71. $attrs = explode(',', $skuAttr);
  72. $parsed = [];
  73. foreach ($attrs as $attr) {
  74. if (strpos($attr, ':') !== false) {
  75. list($name, $value) = explode(':', $attr, 2);
  76. $parsed[] = [
  77. 'name' => trim($name),
  78. 'value' => trim($value)
  79. ];
  80. }
  81. }
  82. return $parsed;
  83. }
  84. return [];
  85. }
  86. /**
  87. * 生成SKU规格属性JSON字符串
  88. * @param array $specs 规格数组,格式:[['name' => '颜色', 'value' => '红色'], ...]
  89. * @return string 规格属性JSON字符串
  90. */
  91. public static function buildSkuAttr($specs)
  92. {
  93. if (empty($specs) || !is_array($specs)) {
  94. return '';
  95. }
  96. $attrs = [];
  97. foreach ($specs as $spec) {
  98. if (isset($spec['name']) && isset($spec['value']) && !empty($spec['name']) && !empty($spec['value'])) {
  99. $attrs[] = [
  100. 'name' => trim($spec['name']),
  101. 'value' => trim($spec['value'])
  102. ];
  103. }
  104. }
  105. return !empty($attrs) ? json_encode($attrs, JSON_UNESCAPED_UNICODE) : '';
  106. }
  107. /**
  108. * 检查SKU规格属性是否匹配
  109. * @param string $skuAttr1 第一个SKU的规格属性
  110. * @param string $skuAttr2 第二个SKU的规格属性
  111. * @return bool 是否匹配
  112. */
  113. public static function isSkuAttrMatch($skuAttr1, $skuAttr2)
  114. {
  115. if (empty($skuAttr1) && empty($skuAttr2)) {
  116. return true;
  117. }
  118. if (empty($skuAttr1) || empty($skuAttr2)) {
  119. return false;
  120. }
  121. // 解析为统一的数组格式进行比较
  122. $parsed1 = self::parseSkuAttr($skuAttr1);
  123. $parsed2 = self::parseSkuAttr($skuAttr2);
  124. if (count($parsed1) !== count($parsed2)) {
  125. return false;
  126. }
  127. // 按规格名排序后比较
  128. usort($parsed1, function($a, $b) {
  129. return strcmp($a['name'], $b['name']);
  130. });
  131. usort($parsed2, function($a, $b) {
  132. return strcmp($a['name'], $b['name']);
  133. });
  134. for ($i = 0; $i < count($parsed1); $i++) {
  135. if ($parsed1[$i]['name'] !== $parsed2[$i]['name'] ||
  136. $parsed1[$i]['value'] !== $parsed2[$i]['value']) {
  137. return false;
  138. }
  139. }
  140. return true;
  141. }
  142. /**
  143. * 获取SKU规格的简短显示文本
  144. * @param string $skuAttr 规格属性字符串
  145. * @param int $maxLength 最大长度
  146. * @return string 简短显示文本
  147. */
  148. public static function getShortSkuAttr($skuAttr, $maxLength = 50)
  149. {
  150. $formatted = self::formatSkuAttr($skuAttr);
  151. if (mb_strlen($formatted) <= $maxLength) {
  152. return $formatted;
  153. }
  154. return mb_substr($formatted, 0, $maxLength - 3) . '...';
  155. }
  156. }