Я ломаю голову и не могу найти хорошее решение для моей проблемы. Я пытаюсь разработать систему, которую я могу использовать для комплектации в нашей системе заказов.
Дело в том, что из набора заказов я хочу выбрать 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 верхних ордера, которые очень похожи друг на друга, с чего мне начать?
Любая помощь приветствуется!
Сортировать 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 различий.
Вот что я бы сделал, если бы у меня была проблема:
$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.