业务场景说明:经销商业务员去拜访终端超市下销售单,然后司机根据销售单次日给超市送货。送货的时候,可能会修改销售单(超市老板改变原来想法),比如多要商品,少要商品等等。为了保证库存正确。我们需要把订单修改前后的商品差距做出入库操作。
数据场景说明:业务员下原始订单如下
商品A(gid=1) 50箱
商品B(gid=2) 30箱
商品C(gid=3) 20箱
司机送货的时候,修改订单为:
商品B(gid=2) 20箱
商品C(gid=3) 30箱
商品D(gid=4) 20箱
通过前后两者的对比,我们发现新增加的商品为,应该做出库单,
商品C 10箱
商品D 20箱
减少的商品为,应该做退库单,
商品A 50箱
商品B 10箱
那么,我们怎样通过简单高效的方法来找到这个差距呢?
原始订单数组: $order_old_goods =array (
array ( 'id' => 1, 'num' => 50 ),
array ( 'id' => 2, 'num' => 30 ),
array( 'id' => 3, 'num' => 20 )
);
新修改订单数组: $order_new_goods = array (
array( 'id' => 2, 'num' => 20 ),
array( 'id' => 3, 'num' => 30 ),
array( 'id' => 4, 'num' => 20 )
);
我们需要找到新加的商品组 $order_add_goods 和减少的商品组$order_reduce_goods
虽然PHP数组操作API很多,但是都是基于数据原理而言,不能完全应用于业务层面,因此在这里,我们自己来实现数组(集合)和数组(集合)的对比操作。从数据处理的角度来讲,集合与集合的操作,最终还要转化成集合和单一元素的操作。为了快速解决集合和单一元素的操作,我们使用PHP数组下标来实现。
我们首先将构建两个新的订单商品数组,商品ID(gid)作为数组下标,如下:
原始订单数组: $order_old_goods2 =array (
1=> array ( 'id' => 1, 'num' =>50 ),
2=> array ( 'id' => 2, 'num' =>30 ),
3=> array ( 'id' => 3, 'num' =>20 )
);
新修改订单数组: $order_new_goods2 = array (
2=> array ( 'id' => 2, 'num' =>20 ),
3=> array ( 'id' => 3, 'num' =>30 ),
4=> array ( 'id' => 4, 'num' =>20 )
);
注意,这是新建的两个数组$order_old_goods2 和 $order_new_goods2,不破坏原始数据。
数组找差距肯定是要进行foreach循环的,我们循环哪一个都是一样的,这里我们循环原始订单 $order_old_goods2,在循环过程中,我们还要做一步重要删除操作,稍后解释。
foreach ( $order_old_goods2 as $gid => $value)
{
//如果不在 $order_new_goods2中,说明是不要的商品(gid=1)
if(empty( $order_new_goods2[$gid] ) )
{
$order_reduce_goods[$gid]= $value['num'];
continue;
}
//如果在 $order_new_goods2中,说明是交集
//那么我们就需要判断数量的差异
$old_num= $value['num'];
$new_num= $order_new_goods2[$gid]['num'];
//接下来就好办了,根据数量差距来决定
if($new_num > $old_num ) {
$order_add_goods[$gid] = $new_num - $old_num; // 多要的商品
}else {
$order_reduce_goods[$gid]= $old_num - $new_num; // 少要的商品
}
//从 $order_new_goods2 删除交集,为什么要删除呢?
//很简单,如果循环完毕后,$order_new_goods2还存在商品的话,
//那一定是新加的商品,嘿嘿!变相寻找差集.
unset($order_new_goods2[$gid] );
}
// 如果 $order_new_goods2 还存在商品的话,就一定是新加的商品 (gid=4)
foreach($order_new_goods2 as $gid => $value)
{
$order_add_goods[$gid] = $value['num'];
}
经过以上代码逻辑的判断,我们终于找全了$order_add_goods 和 $order_reduce_goods
其实还有另外一种处理方式,更加简单,清晰!就是将新旧订单的商品全部存入一个新数组中,循环此数组即可,即循环两数组的合集。我们在 $order_old_goods2 和 $order_new_goods2的基础上面,再一次构建一个$gid_list数组,用来存在所有gid,此过程省略,不在列出。$gid_list = array(1,2,3,4); 接下来我们就开始循环$gid_list操作。
foreach( $gid_list as $gid)
{
//老订单没有,新订单有,也就是新增加的商品
if(empty($order_old_goods2[$gid] ) && !empty( $order_new_goods2[$gid] ) )
{
$order_add_goods[$gid] = $order_new_goods2[$gid]['num'];
}
//老订单有,新订单没有,也就是不要的商品
if(!empty($order_old_goods2[$gid] ) && empty( $order_new_goods2[$gid] ) )
{
$order_reduce_goods[$gid] = $order_old_goods2[$gid]['num'];
}
//新老订单都存在,那就得判断数量了
if(!empty($order_old_goods2[$gid] ) && !empty( $order_new_goods2[$gid] ) )
{
$old_num= $order_old_goods2[$gid]['num'];
$new_num= $order_new_goods2[$gid]['num'];
if( $new_num > $old_num ) {
$order_add_goods[$gid] = $new_num- $old_num; // 多要的商品
} else {
$order_reduce_goods[$gid] = $old_num - $new_num; // 少要的商品
}
}
}
一次循环就找全了$order_add_goods 和 $order_reduce_goods两个数据。
最后的总结,从以上两种处理方式来讲,有两点需要我们注意,其一是通过数组下标来进行集合和元素的有无判断,其二就是差集的判断,这是比较头疼的,因为是差集,因此不能够通过循环其中一个数组来找全,而循环两个数组的话,代码冗余太多,理解困难。因此我们需要通过循环合集的方式,一次性的找到交集和差集。这种方式虽然需要构造新数据形式,但是代码清晰,语义简单,可读性高。