математика — Найти совпадающие порядки, используя массивы и переполнение стека

Я ломаю голову и не могу найти хорошее решение для моей проблемы. Я пытаюсь разработать систему, которую я могу использовать для комплектации в нашей системе заказов.

Дело в том, что из набора заказов я хочу выбрать 6 заказов, которые наиболее равны друг другу. На нашем складе большинство заказов, поэтому мы можем сэкономить много времени, выбирая несколько заказов одновременно.

Предположим, у меня есть следующий массив:

<?php

$data = [
156 => [
1,
2,
7,
9,
],
332 => [
3,
10,
6
],
456 => [
1,
],
765 => [
7,
2,
10,
],
234 => [
1,
9,
3,
6,
],
191 => [
7,
],
189 => [
7,
6,
3,
],
430 => [
10,
9,
1,
],
482 => [
1,
2,
7,
],
765 => [
1,
5,
9,
]
];
?>

Ключ массива — это идентификатор заказа, а значения — идентификаторы продукта, которые он содержит. Если я хочу выбрать 3 верхних ордера, которые очень похожи друг на друга, с чего мне начать?

Любая помощь приветствуется!

0

Решение

Сортировать productId внутри заказа (ASC)

В цикле проверяем разницу (array_diff) в каждом порядке друг к другу.
Создайте массив с помощью defference. Например:

$diff = [
'156' => [ //order id
'234' => 4, // with order 234 has 4 differences
'332' => 7, // with order 332 has 7 differences
// and so on...
],
]

порядок $diff по ASC и получить заказ с меньшими различиями.

Также вы можете добавить общий размер продуктов для сравнения с разницей. Например, если у вас есть заказ на 100 товаров и 10 различий — это лучше, чем заказ на 10 товаров и 9 различий.

0

Другие решения

Вот что я бы сделал, если бы у меня была проблема:

$topOrders = [];
foreach($data as $value):
foreach($value as $order):
if(isset($$order)):
$$order++;
else:
$$order = 1;
endif;
$topOrders[$order] = $$order;
endforeach;
endforeach;

print_r($topOrders);

В $ topOrders у вас есть массив, который содержит в качестве ключа идентификатор, а в качестве значения вы получаете количество заказов. Все, что вам нужно сделать, это отсортировать массив, чтобы получить топ-3.

0

По вопросам рекламы [email protected]