今天接到一个网单,编写一个算法,传入一个商品数组,获取5个商品,每个商品的数量随机,商品*数量=设定目标接近价,目前想到的办法只有递归。
代码如下:
protected function execute()
{
$products = [];
for ($i = 1; $i <= 100; $i++) {
$products[] = [
"id" => $i,
"name" => "商品" . $i,
"price" => rand(1, 100),
];
}
$result = self::get_random_order($products, 1000);
print_r($result);
}
public static function get_random_order($products, $order_amount)
{
//随机5个商品
$selected_indices = array_rand($products, 5);
$selected_products = array_intersect_key($products, array_flip($selected_indices));
$min_product_price = min(array_column($selected_products, 'price'));
//随机商品数量
$quantities = [];
foreach ($selected_products as $product_index => $product) {
$quantities[$product_index] = rand(1, intval($order_amount / $product["price"])); // 随机选择商品数量
}
// 计算总价
$total_price = array_reduce(array_keys($selected_products), function ($carry, $product_index) use ($selected_products, $quantities) {
// 使用商品的索引作为键来访问 $quantities 数组
return $carry + $selected_products[$product_index]["price"] * $quantities[$product_index];
}, 0);
// 加入商品数量
foreach ($selected_products as $product_index => $product) {
$selected_products[$product_index]["quantity"] = $quantities[$product_index];
}
if (abs($total_price - $order_amount) < $min_product_price) { // 如果总价与订单金额相近,则返回结果
return ["products" => $selected_products, "total_price" => $total_price, "min_product_price" => $min_product_price];
} else {
return self::get_random_order($products, $order_amount); // 重新生成订单
}
}