今天接到一个网单,编写一个算法,传入一个商品数组,获取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); // 重新生成订单 } }
标签:index,product,price,selected,products,随机,接近,order,最低价 From: https://www.cnblogs.com/bpsh/p/18088480