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兩個數據。

 

最後的總結,從以上兩種處理方式來講,有兩點需要我們注意,其一是通過數組下標來進行集合和元素的有無判斷,其二就是差集的判斷,這是比較頭疼的,因爲是差集,因此不能夠通過循環其中一個數組來找全,而循環兩個數組的話,代碼冗餘太多,理解困難。因此我們需要通過循環合集的方式,一次性的找到交集和差集。這種方式雖然需要構造新數據形式,但是代碼清晰,語義簡單,可讀性高。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章