PHPには比較的複雑な配列があり、特定の方法で並べ替える必要がありますが、フィルターと並べ替えの数は少し複雑で、単純なソリューションではうまくいかないようです。
問題:次の基準に基づいて「shipto」グループにフィルタリングする必要がある順序の製品があります。製品を出荷できる日付、製品を他の製品とグループ化できるかどうか、およびどの倉庫で商品はから発送できます。2つの製品の日付、倉庫が同じで、グループ化が許可されている場合、それらは同じ「出荷先」にまとめて配置されます。
現在の解決策(完全には実現されていません)
注文を抽出するときは、その中のアイテムをトラバースし、次の情報を使用して配列を作成します(参考までに、これには、この問題を解決するために必要な情報よりも多くの情報が含まれている可能性があります)
$allProducts = array();
$today = date("Ymd");
/* If the product is being shipped now, put in the Today ShipTo dated 00000000 */
if (($today > $start) && ($today < $end)) {
array_push($allProducts, array('ship' => '00000000', 'defaultwarehouse' => $defaultwarehouse, 'warehouse' => $warehouse, 'group' => $group,'product' => $product, 'start_month' => $start_month, 'start_day' => $start_day, 'end_month' => $end_month, 'end_day' => $end_day, 'description' => $description, 'qty_ordered' => $qty_ordered, 'row_total' => $row_total, 'price' => $price, 'tax_amount' => $tax_amount, 'shipping_group' => $shippingGroup, 'today' => $today, 'end' => $end, 'start' => $start ) );
} else {
/* If the product is not being shipped today, put in a Group that matches the starts date for the ShipTo */
array_push($allProducts, array('ship' => $start, 'defaultwarehouse' => $defaultwarehouse, 'warehouse' => $warehouse, 'group' => $group, 'product' => $product, 'start_month' => $start_month, 'start_day' => $start_day, 'end_month' => $end_month, 'end_day' => $end_day, 'description' => $description, 'qty_ordered' => $qty_ordered, 'row_total' => $row_total, 'price' => $price, 'tax_amount' => $tax_amount, 'shipping_group' => $shippingGroup, 'today' => $today, 'end' => $end, 'start' => $start ));
}
endif;
$ defaultwarehouseはデフォルトの倉庫(つまり1)を表す数値であり、$ Warehouseは製品が入る可能性のあるすべての倉庫(つまり1,2)であり、$ startは製品が最初に出荷できる日付です(つまり20121201の場合)。 2012年12月1日;Ymd、00000000は今日を表すため、数値で並べ替えることができます)、$ groupは、製品を他のアイテムと一緒に出荷できるかどうかを示すブール値です(つまり、1ははい、0はいいえ)
ここでの私の最初のアイデアは、グループ、ウェアハウス、開始日に基づいてアレイをソートすることでした。次に、アレイをトラバースして「shipto」を構築し、アレイの特定のコンポーネント(WarehouseやStartなど)が変更されたら、前のshiptoを閉じて新しいshiptoを開始します。グループウェアハウスと複数のウェアハウスを方程式から外すと、このロジックを機能させることができます。しかし、私の仕事ではそれらを入れる必要があるので、次のような問題が発生しています。
まず、グループで並べ替えた後、残りのフィルターに対してGroup=YesとGroup=Noの2つのサブソートを実行したいと思います。これにより、配列を2つの配列に分割し、同様に、ただし別々に並べ替える必要があるのではないかと思いました。このようにするのは非効率的なようですが、よくわかりません。
次に、ウェアハウスはコンマで区切られた値になる可能性があるため、それをフィルタリングして適切な一致を取得するにはどうすればよいですか。つまり、倉庫の価値が1:1、2:3である3つの製品がある場合、これは2つのshiptoにグループ化する必要があります。1つは1:1、2、もう1つは3です。
問題についての考え
私の気持ちは、アイテムをトラバース可能な配列にフィルタリングすることでこの問題について考えている方法であり、それに取り組むための最良の方法ではないかもしれません。注文アイテムを個別に新しい「Shipments」配列にプッシュして、各アイテムを現在のすべての「Shipments」と照合する必要がある場合があります。しかし、それがどのように機能するかについても正確にはわかりません。あるいは、これを達成する方法について私がまったく考えていない別の方法があるかもしれません。
配列データの例(簡単にするために余分なデータは削除されています):
[0]=>
'ship' => 00000000
'defaultwarehouse' => 1
'warehouse' => 1
'group' => 1
'sku' => 'ABC123'
[1]=>
'ship' => 00000000
'defaultwarehouse' => 1
'warehouse' => 1,2
'group' => 1
'sku' => 'DEF234'
[2]=>
'ship' => 00000000
'defaultwarehouse' => 2
'warehouse' => 1,2
'group' => 1
'sku' => 'GHI567'
[3]=>
'ship' => 20121220
'defaultwarehouse' => 1
'warehouse' => 1,2
'group' => 1
'sku' => 'JKL890'
[4]=>
'ship' => 20121220
'defaultwarehouse' => 1
'warehouse' => 1,2
'group' => 1
'sku' => 'MNO123'
[5]=>
'ship' => 20130401
'defaultwarehouse' => 1
'warehouse' => 1
'group' => 1
'sku' => 'PQR456'
[6]=>
'ship' => 20130401
'defaultwarehouse' => 1
'warehouse' => 1
'group' => 0
'sku' => 'STU789'
これにより、5つの「shipto」グループが作成されます。
shipto[1] => ABC123, DEF234 (Base "group" for all other comparisons)
shipto[2] => GHI567 (Default warehouse does not match, previous shiptos)
shipto[3] => JKL890, MNO123 (Different shipping date)
shipto[4] => PRQ456 (Different shipping date from all others)
shipto[5] => STU789 (Can not be grouped with other shipments)