業務場景說明:經銷商業務員去拜訪終端超市下銷售單,然後司機根據銷售單次日給超市送貨。送貨的時候,可能會修改銷售單(超市老闆改變原來想法),比如多要商品,少要商品等等。爲了保證庫存正確。我們需要把訂單修改前後的商品差距做出入庫操作。
數據場景說明:業務員下原始訂單如下
商品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兩個數據。
最後的總結,從以上兩種處理方式來講,有兩點需要我們注意,其一是通過數組下標來進行集合和元素的有無判斷,其二就是差集的判斷,這是比較頭疼的,因爲是差集,因此不能夠通過循環其中一個數組來找全,而循環兩個數組的話,代碼冗餘太多,理解困難。因此我們需要通過循環合集的方式,一次性的找到交集和差集。這種方式雖然需要構造新數據形式,但是代碼清晰,語義簡單,可讀性高。