Вот метод, который зацикливает уникальные веса и находит сумму qty каждого веса и умножает ее на вес.
В вашем случае это делает один цикл.
$weights = array_column($items, 'weight');
$result =0;
Foreach(array_unique($weights) as $weight){
// Finds the items with the weight 1 for example
$weightitems = preg_grep("/". $weight . "/", $weights);
// Sum quantity of items with the weight of 1 and multiply with weight (1).
$result += array_sum(array_column(array_intersect_key($items, $weightitems), "qty")) * $weight;
}
Echo $result;
Обратите внимание, что я добавил «5» только для того, чтобы убедиться, что он работает правильно в моем примере кода.
https://3v4l.org/V293P
Чуть более оптимизированный код, но, насколько я вижу, он не быстрее простого цикла.
Я могу сделать это в 4 раза медленнее, в зависимости от ввода, но не могу подобрать его ближе, чем это.
$weights =array_unique(array_column($items, 'weight'));
$result =[];
Foreach($weights as $weight){
$weightitems = array_filter($items, function ($var) use ($weight) {
return ($var['weight'] == $weight);
});
$result[] = array_sum(array_column($weightitems, "qty")) * $weight;
}
Echo array_sum($result) ."\n";
https://3v4l.org/aB7d9
Насколько точно это должно быть?
Это быстрее, чем зацикливание, но отключено на 1 для 3000 элементов и всего 17992.
Это в пределах погрешности, то это быстрее.
Я вычисляю среднее значение суперпродукта из двух столбцов, используя array_sum, array_column и count.
$count = count($items);
$weights = array_sum(array_column($items, 'weight'));
$qty = array_sum(array_column($items, 'qty'));
Echo ($qty * $weights)/$count ."\n";
// 17991 (should be 17992)
https://3v4l.org/c3CIg
Я думаю, что уже испробовал все возможные решения.