本文目录导读:

我将为您提供一个PHP多规格商品SKU算法实现,包含完整的SKU生成、库存管理和价格计算功能。
核心SKU生成算法
<?php
class SKUGenerator
{
/**
* 生成所有SKU组合
* @param array $specs 规格字典,如 ['颜色' => ['红色','蓝色'], '尺寸' => ['S','M','L']]
* @return array 所有SKU组合
*/
public function generateCombinations(array $specs): array
{
$result = [[]];
foreach ($specs as $specName => $specValues) {
$temp = [];
foreach ($result as $combination) {
foreach ($specValues as $value) {
$temp[] = array_merge($combination, [$specName => $value]);
}
}
$result = $temp;
}
return $result;
}
/**
* 生成SKU编码
* @param array $combination 规格组合
* @param string $productId 商品ID
* @return string
*/
public function generateSkuCode(array $combination, string $productId = ''): string
{
$code = $productId ? $productId . '-' : '';
foreach ($combination as $specName => $value) {
$code .= $this->encodeSpec($specName, $value) . '-';
}
return rtrim($code, '-');
}
private function encodeSpec(string $name, string $value): string
{
// 简单的编码,可根据需求调整
return strtoupper(mb_substr($name, 0, 1)) . strtoupper(mb_substr($value, 0, 2));
}
}
商品SKU管理类
<?php
class ProductSKUManager
{
private $productId;
private $specs; // 规格字典
private $skuList = []; // SKU列表
public function __construct(string $productId, array $specs)
{
$this->productId = $productId;
$this->specs = $specs;
}
/**
* 初始化所有SKU
* @param float $defaultPrice 默认价格
* @param int $defaultStock 默认库存
*/
public function initSKUs(float $defaultPrice = 0, int $defaultStock = 0): void
{
$generator = new SKUGenerator();
$combinations = $generator->generateCombinations($this->specs);
foreach ($combinations as $index => $combination) {
$sku = [
'sku_code' => $generator->generateSkuCode($combination, $this->productId),
'specs' => $combination,
'price' => $defaultPrice,
'stock' => $defaultStock,
'image' => '',
'weight' => 0,
'status' => 1
];
$this->skuList[] = $sku;
}
}
/**
* 获取特定规格的SKU
* @param array $selectedSpecs 选中的规格,如 ['颜色' => '红色', '尺寸' => 'M']
* @return array|null
*/
public function findSKU(array $selectedSpecs): ?array
{
foreach ($this->skuList as $sku) {
$match = true;
foreach ($selectedSpecs as $specName => $value) {
if (!isset($sku['specs'][$specName]) || $sku['specs'][$specName] !== $value) {
$match = false;
break;
}
}
if ($match) {
return $sku;
}
}
return null;
}
/**
* 更新SKU库存
*/
public function updateStock(array $selectedSpecs, int $quantity): bool
{
$sku = $this->findSKU($selectedSpecs);
if (!$sku) return false;
// 更新逻辑,这里简化为直接修改
foreach ($this->skuList as &$item) {
if ($item['sku_code'] === $sku['sku_code']) {
$item['stock'] = $quantity;
return true;
}
}
return false;
}
/**
* 库存扣减
*/
public function decreaseStock(array $selectedSpecs, int $quantity): bool
{
$sku = $this->findSKU($selectedSpecs);
if (!$sku || $sku['stock'] < $quantity) return false;
foreach ($this->skuList as &$item) {
if ($item['sku_code'] === $sku['sku_code']) {
$item['stock'] -= $quantity;
return true;
}
}
return false;
}
/**
* 检查规格是否可选(用于前端联动)
*/
public function isSpecAvailable(array $selectedSpecs, string $specName, string $specValue): bool
{
$testSpecs = $selectedSpecs;
$testSpecs[$specName] = $specValue;
$sku = $this->findSKU($testSpecs);
return $sku !== null && $sku['stock'] > 0;
}
/**
* 获取所有SKU
*/
public function getAllSKUs(): array
{
return $this->skuList;
}
}
SKU价格计算
<?php
class SKUPriceCalculator
{
/**
* 计算SKU价格(考虑促销、会员价等)
* @param array $sku SKU数据
* @param array $user 用户信息(可选)
* @return float
*/
public function calculatePrice(array $sku, array $user = []): float
{
$basePrice = $sku['price'];
// 会员价计算
if (isset($user['level']) && isset($sku['member_prices'])) {
$memberPrices = $sku['member_prices'];
if (isset($memberPrices[$user['level']])) {
$basePrice = $memberPrices[$user['level']];
}
}
// 促销价格
if (isset($sku['promotion_price']) && $sku['promotion_price'] > 0) {
$promotionPrice = $sku['promotion_price'];
if ($promotionPrice < $basePrice) {
$basePrice = $promotionPrice;
}
}
// 阶梯价格计算
if (isset($sku['tier_prices']) && !empty($sku['tier_prices'])) {
$quantity = $sku['quantity'] ?? 1;
foreach ($sku['tier_prices'] as $tier) {
if ($quantity >= $tier['min_quantity']) {
$basePrice = $tier['price'];
break;
}
}
}
return round($basePrice, 2);
}
/**
* 批量计算价格
*/
public function calculateBatchPrices(array $skuList, array $user = []): array
{
$result = [];
foreach ($skuList as $sku) {
$result[$sku['sku_code']] = $this->calculatePrice($sku, $user);
}
return $result;
}
}
完整使用示例
<?php
// 使用示例
class ProductExample
{
public function demo()
{
// 定义商品规格
$specs = [
'颜色' => ['红色', '蓝色', '绿色'],
'尺寸' => ['S', 'M', 'L'],
'版本' => ['标准版', '豪华版']
];
// 创建SKU管理器
$manager = new ProductSKUManager('P001', $specs);
// 初始化所有SKU,默认价格599,库存100
$manager->initSKUs(599.00, 100);
// 获取所有SKU数量
$allSKUs = $manager->getAllSKUs();
echo "共生成 " . count($allSKUs) . " 个SKU\n"; // 3 × 3 × 2 = 18个
// 查找特定SKU
$selected = ['颜色' => '红色', '尺寸' => 'M', '版本' => '标准版'];
$sku = $manager->findSKU($selected);
if ($sku) {
echo "找到SKU: " . $sku['sku_code'] . "\n";
echo "价格: ¥" . $sku['price'] . "\n";
echo "库存: " . $sku['stock'] . "\n";
}
// 扣减库存
$manager->decreaseStock($selected, 2);
echo "扣减后库存: " . $manager->findSKU($selected)['stock'] . "\n";
// 检查规格是否可选
$available = $manager->isSpecAvailable(['颜色' => '红色'], '尺寸', 'M');
echo "红色M码是否可选: " . ($available ? '是' : '否') . "\n";
// 价格计算
$calculator = new SKUPriceCalculator();
$price = $calculator->calculatePrice($sku, ['level' => 'vip']);
echo "VIP价格: ¥" . $price . "\n";
// 输出所有SKU
echo "\n所有SKU列表:\n";
foreach ($allSKUs as $item) {
$specStr = [];
foreach ($item['specs'] as $key => $value) {
$specStr[] = "$key: $value";
}
echo $item['sku_code'] . " | " . implode(", ", $specStr)
. " | ¥" . $item['price'] . " | 库存:" . $item['stock'] . "\n";
}
}
}
// 运行示例
$example = new ProductExample();
$example->demo();
数据库表结构
-- 商品表
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- 规格表
CREATE TABLE product_specs (
id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
spec_name VARCHAR(50) NOT NULL,
spec_values JSON NOT NULL,
FOREIGN KEY (product_id) REFERENCES products(id)
) ENGINE=InnoDB;
-- SKU表
CREATE TABLE product_skus (
id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
sku_code VARCHAR(100) UNIQUE NOT NULL,
specs JSON NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL DEFAULT 0,
status TINYINT DEFAULT 1,
image VARCHAR(255),
weight DECIMAL(10,2) DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(id),
INDEX idx_sku_code (sku_code)
) ENGINE=InnoDB;
-- SKU促销价格表
CREATE TABLE sku_promotions (
id INT PRIMARY KEY AUTO_INCREMENT,
sku_id INT NOT NULL,
promotion_price DECIMAL(10,2),
start_time DATETIME,
end_time DATETIME,
FOREIGN KEY (sku_id) REFERENCES product_skus(id)
) ENGINE=InnoDB;
前端联动判断算法
<?php
class FrontendSkuHelper
{
/**
* 获取可选规格值(前端联动用)
* @param array $allSKUs 所有SKU
* @param array $selectedSpecs 已选规格
* @return array 每项规格的可选值
*/
public function getAvailableOptions(array $allSKUs, array $selectedSpecs): array
{
$availableOptions = [];
foreach ($selectedSpecs as $specName => $specValue) {
if (empty($specValue)) continue;
// 复制当前选择,但排除正在检查的规格
$tempSpecs = $selectedSpecs;
unset($tempSpecs[$specName]);
// 找出该规格的可选值
$values = [];
foreach ($allSKUs as $sku) {
if ($this->matchesSpecs($sku['specs'], $tempSpecs) && $sku['stock'] > 0) {
$values[] = $sku['specs'][$specName];
}
}
$availableOptions[$specName] = array_unique($values);
}
return $availableOptions;
}
private function matchesSpecs(array $skuSpecs, array $requiredSpecs): bool
{
foreach ($requiredSpecs as $name => $value) {
if (!isset($skuSpecs[$name]) || $skuSpecs[$name] !== $value) {
return false;
}
}
return true;
}
}
这个算法实现包含了:
- 多规格组合生成 - 自动生成所有SKU组合
- SKU编码生成 - 统一的SKU编码规则
- 库存管理 - 增减库存、库存检查
- 价格计算 - 支持基础价、会员价、促销价、阶梯价
- 前端联动判断 - 判断哪些规格可选
- 数据库表设计 - 完整的数据结构支持
可以根据具体需求调整算法复杂度和功能范围。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播