一、思路
思路千万种,我这里给出自己的实现思路 ~
【方法一】
- 1、把货品数据处理成以商品ID为键的二维数组
$goodsIdToDetail
- 2、循环处理
$goodsIdToDetail
,定义数组$stockStatus
存放货品库存状态 - 3、如果库存大于0,则
$stockStatus[] = true;
;否则为false
- 4、处理数组
$stockStatus
:数组去重,索引重置,得到$uniqueStatus
- 5、判断
$uniqueStatus
:$uniqueStatus
个数为1
,并且值为false
。则说明该商品的所有货品库存都为0,下架该商品
【方法二(推荐)】
- 1、把货品数据处理成以商品ID为键的二维数组
$goodsIdToDetail
- 2、循环处理
$goodsIdToDetail
,定义字段$shelfOff
判断货品库存,默认为true
- 3、循环货品,如果货品
库存大于0
,则设置$shelfOff
为false
,跳出货品循环 - 4、根据
$shelfOff
字段判断商品是否需要下架:$shelfOff
为true
,则下架该商品
【对比】
- 很明显:
方法二
优于方法一
二、代码
public function test() {
//商品数据
$goodsList = [ //这个变量这里暂时没用到~
['id' => 1, 'name' => '商品1', 'shelf_on' => 1], //shelf_on:0-下架;1-上架
['id' => 2, 'name' => '商品2', 'shelf_on' => 1],
['id' => 3, 'name' => '商品3', 'shelf_on' => 1],
];
//货品数据
$goodsDetailList = [
['id' => 1, 'goods_id' => 1, 'stock' => 1],
['id' => 2, 'goods_id' => 1, 'stock' => 3],
['id' => 3, 'goods_id' => 2, 'stock' => 0],
['id' => 4, 'goods_id' => 3, 'stock' => 1],
['id' => 5, 'goods_id' => 3, 'stock' => 3],
['id' => 6, 'goods_id' => 3, 'stock' => 0],
];
//处理数据:[ 商品Id 对应 货品 ] 二维数组
$goodsIdToDetail = [];
foreach ($goodsDetailList as $value) {
$goodsIdToDetail[$value['goods_id']][] = $value;
}
$updateGoodsData = []; //定义待更新的商品数据
//self::method1($goodsIdToDetail, $updateGoodsData);
self::method2($goodsIdToDetail, $updateGoodsData);
echo '结果为<br/>';
if ($updateGoodsData) {
//$goodsDao->updateAll($updateGoodsData); //批量下架商品
}
var_export($updateGoodsData);
}
public function method1($goodsIdToDetail, &$updateGoodsData) {
foreach ($goodsIdToDetail as $goodsId => $value) {
$stockStatus = []; //库存状态一维数组:false-库存等于0;true-库存大于0
foreach ($value as $item) {
if ($item['stock'] > 0) {
$stockStatus[] = true; //库存大于0
} else {
$stockStatus[] = false; //库存等于0
}
}
//根据$stockStatus一维数组判断商品是否需要下架:商品下的所有货品库存为0时,商品下架
//具体做法为:数组去重,索引重置;判断结果:个数为1,并且值为false。则这个商品货品库存都为0,该商品需要自动下架~
$uniqueStatus = array_values(array_unique($stockStatus));
if ((count($uniqueStatus) == 1) && ($uniqueStatus[0] == false)) {
$updateGoodsData[] = [
'id' => $goodsId,
'shelf_on' => 0,
];
}
}
}
public function method2($goodsIdToDetail, &$updateGoodsData) {
foreach ($goodsIdToDetail as $goodsId => $value) {
$shelfOff = true; //默认下架:如果有库存大于0的,则修改状态,跳出循环
foreach ($value as $item) {
if ($item['stock'] > 0) {
$shelfOff = false;
break;
}
}
if ($shelfOff) {
//如果下架值为true,则下架该商品
$updateGoodsData[] = [
'id' => $goodsId,
'shelf_on' => 0,
];
}
}
}
三、打印结果
结果为
array ( 0 => array ( 'id' => 2, 'shelf_on' => 0, ), )