PHP数组(集合)与数组(集合)的操作

业务场景说明:经销商业务员去拜访终端超市下销售单,然后司机根据销售单次日给超市送货。送货的时候,可能会修改销售单(超市老板改变原来想法),比如多要商品,少要商品等等。为了保证库存正确。我们需要把订单修改前后的商品差距做出入库操作。

 

数据场景说明:业务员下原始订单如下

 

商品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两个数据。

 

最后的总结,从以上两种处理方式来讲,有两点需要我们注意,其一是通过数组下标来进行集合和元素的有无判断,其二就是差集的判断,这是比较头疼的,因为是差集,因此不能够通过循环其中一个数组来找全,而循环两个数组的话,代码冗余太多,理解困难。因此我们需要通过循环合集的方式,一次性的找到交集和差集。这种方式虽然需要构造新数据形式,但是代码清晰,语义简单,可读性高。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咆哮的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值