首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据订购的大多数常见产品,批量排序4份“订单”

根据订购的大多数常见产品,批量排序4份“订单”
EN

Stack Overflow用户
提问于 2019-08-12 11:47:44
回答 1查看 71关注 0票数 1

我有这个问题,我甚至不知道怎么开始。这是一个谜题,可能可以通过多种方式解决,但我没有单一解决方案的想法。

我有$num_of_oders % 4 == 0订单。总会有4,8,12,16等订单。每个订单都可以有x个订购的产品。

下面是一个示例代码:

代码语言:javascript
复制
$orders = [];

$orders[0]['order_id'] = 1;
$orders[0]['products'] = [1,2,3,4,5,6,7,8,9,10];

$orders[1]['order_id'] = 2;
$orders[1]['products'] = [3,4,13,99,76,23,12,14,53];

$orders[2]['order_id'] = 3;
$orders[2]['products'] = [1,54,23,2,34,10,11,13,14,15];

$orders[3]['order_id'] = 4;
$orders[3]['products'] = [30,31,32,33,34,35];

$orders[4]['order_id'] = 5;
$orders[4]['products'] = [30,31,32,33,34,35];

$orders[5]['order_id'] = 6;
$orders[5]['products'] = [89,65,31,26,54,78,14,45,62,46,34,12];

$orders[6]['order_id'] = 7;
$orders[6]['products'] = [23,21,22,24,25,26,27,28,29];

$orders[7]['order_id'] = 8;
$orders[7]['products'] = [23,21,22,24,25,26,27,28,29];

$orders[8]['order_id'] = 9;
$orders[8]['products'] = [23,44,34,36,37,38,86,45,41,67];

$orders[9]['order_id'] = 10;
$orders[9]['products'] = [1,23,11,13,15,32,45,65,75,24];

$orders[10]['order_id'] = 11;
$orders[10]['products'] = [15,16,77,65,48,34,67,87,45,24,68,90];

$orders[11]['order_id'] = 12;
$orders[11]['products'] = [1,2,3,4,5,6,76,43,87,65,99,27,54,64,24,67,21];

$orders[12]['order_id'] = 13;
$orders[12]['products'] = [23,13,14,65,43,59,54,34,32,57,86,24,12,43,75];

$orders[13]['order_id'] = 14;
$orders[13]['products'] = [1,13,2,6,5,3,7,45,23,87,33,65,46,65,12,54,43];

$orders[14]['order_id'] = 15;
$orders[14]['products'] = [23,13,14,65,43,51,54,34,32,57,86,24,12,43,75];

$orders[15]['order_id'] = 16;
$orders[15]['products'] = [1,2,56,4,5,6,7,11,34,54,3,12,17,42,20,64,45,53,27,35,23];

foreach($orders as $order) {
    // What to do here??

}

我的问题是:我需要在批处理4中过滤订单,但是每一批都需要/包含订单,其中有最常见的订购产品(产品in )。订单只能在一批中订购。

在当前情况下,这意味着最终结果将是4批数组。每批订单将有4个订单,这些订单将具有最常见的/相同的产品ids。

通过这种方式,我将能够一批一批地向用户/工作人员显示订单,他将能够更快地从仓库中挑选产品,因为程序将自动选择/过滤大多数常见产品的订单。

你能帮我解决这个问题吗?

如果您需要更多的信息,请让我知道,我会提供。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-12 12:37:02

更新

原始代码仅根据两个订单之间的公共产品进行排序,然后将最大值分组在一起。然而,这可能会产生这样一种情况,即这两对产品没有共同的产品,有一批4批订单。更新后的代码查找批次为4,其中最常见的产品位于所有4种产品之间:

代码语言:javascript
复制
foreach ($orders as $k1 => $o1) {
    // find number of products in common with other orders
    foreach ($orders as $k2 => $o2) {
        if ($k2 <= $k1) continue;
        foreach ($orders as $k3 => $o3) {
            if ($k3 <= $k2) continue;
            foreach ($orders as $k4 => $o4) {
                if ($k4 <= $k3) continue;
                $order_set = "{$o1['order_id']}-{$o2['order_id']}-{$o3['order_id']}-{$o4['order_id']}";
                $common[$order_set] = count(array_intersect($o1['products'], $o2['products'], $o3['products'], $o4['products']));
            }
        }
    }
}
arsort($common);
$orders_used = array();
foreach (array_keys($common) as $order_set) {
    list($o1, $o2, $o3, $o4) = explode('-', $order_set);
    // already output any of these orders?
    if (in_array($o1, $orders_used) || in_array($o2, $orders_used) || in_array($o3, $orders_used) || in_array($o4, $orders_used)) continue;
    $orders_used[] = $o1;
    $orders_used[] = $o2;
    $orders_used[] = $o3;
    $orders_used[] = $o4;
    // if we've used all the orders, quit
    if (count($orders_used) == count($orders)) break;
}
for ($i = 0; $i < count($orders_used); $i += 4) {
    $batch = array_slice($orders_used, $i, 4);
    echo "batch " . ($i / 4 + 1) . ": order ids " . implode(',', $batch);
    echo "; common products: " . $common[implode('-', $batch)] . "\n";
}

输出:

代码语言:javascript
复制
batch 1: order ids 1,12,14,16; common products: 5
batch 2: order ids 3,6,13,15; common products: 3
batch 3: order ids 2,7,9,10; common products: 1
batch 4: order ids 4,5,8,11; common products: 0

基于3v4l.org的演示

原始答案

这是你想做的事情(我想)的一种方法。首先,我们将每个订单与其他订单进行比较,以确定它们有多少共同的产品(使用array_intersect)。然后,将该列表按反向顺序排序(即最大到最少数量的共同产品),并对其进行处理,当我们在数组中找到每个order_id时,将其添加到$orders_used数组中(但忽略已经输出其中一个订单的组合)。一旦处理完整个数组,所有订单都将按照与另一个订单有多少个产品的顺序相反的顺序进行$orders_used。然后,可以将该数组拆分为批处理和输出:

代码语言:javascript
复制
foreach ($orders as $key => $order) {
    // find number of products in common with other orders
    foreach ($orders as $k2 => $o2) {
        if ($k2 <= $key) continue;
        $common["{$order['order_id']}-{$o2['order_id']}"] = count(array_intersect($order['products'], $o2['products']));
    }
}
arsort($common);
$orders_used = array();
foreach (array_keys($common) as $order_pair) {
    list($order1, $order2) = explode('-', $order_pair);
    // already output these orders?
    if (in_array($order1, $orders_used) || in_array($order2, $orders_used)) continue;
    $orders_used[] = $order1;
    $orders_used[] = $order2;
    // if we've used all the orders, quit
    if (count($orders_used) == count($orders)) break;
}
for ($i = 0; $i < count($orders_used); $i += 4) {
    echo "batch " . ($i / 4 + 1) . ": orders " . implode(',', array_slice($orders_used, $i, 4)) . "\n";
}

输出:

代码语言:javascript
复制
batch 1: orders 13,15,14,16
batch 2: orders 7,8,4,5
batch 3: orders 1,12,3,10
batch 4: orders 9,11,2,6

基于3v4l.org的演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57460620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档