我正在使用 Laravel 8 制定饮食计划。
数据库看起来像这样:
食谱 | 类别 | 卡路里 |
---|---|---|
鸡蛋 | 早餐 | 180 |
酸奶 | 早餐 | 50 |
苹果派 | 零食 | 289 |
香蕉派 | 零食 | 386 |
番茄意大利面 | 午餐 | 712 |
鸡肉沙拉 | 午餐 | 956 |
蔬菜汤 | 晚餐 | 410 |
鱼配土豆 | 晚餐 | 652 |
我想根据平均每日卡路里获取当天的膳食。
例如,如果我每天的热量是1500kcal,我想要当天的4份食谱(早餐/午餐/晚餐/零食),其总热量在1300-1500卡路里之间。
我构建了一些函数来执行此操作:
use App\Models\Recipe;
// Function to generate combinations of recipes
function generateCombinations($items, $n, $start = 0, $result = [], &$results = []) {
if ($n === 0) {
$results[] = $result;
return;
}
for ($i = $start; $i < count($items); $i++) {
$result[] = $items[$i];
generateCombinations($items, $n - 1, $i + 1, $result, $results);
array_pop($result);
}
}
// Function to filter combinations by total calories
function filterCombinationsByCalories($combinations, $dailyCalories) {
return array_filter($combinations, function($combination) use ($dailyCalories) {
$totalCalories = array_sum(array_column($combination, 'calories'));
return $totalCalories >= $dailyCaloriesMin && $totalCalories <= $dailyCalories;
});
}
// Function to get daily meal plan
function getDailyMealPlan($dailyCalories) {
$mealCategories = ['breakfast','lunch', 'dinner', 'snacks'];
$mealPlan = [];
foreach ($mealCategories as $category) {
$recipes = Recipe::where('category', $category)->get()->toArray();
// Generate combinations of recipes for this meal category
$combinations = [];
generateCombinations($recipes, 1, 0, [], $combinations);
// Filter combinations by total calories
$filteredCombinations = filterCombinationsByCalories($combinations, $dailyCalories);
// If there are no valid combinations, choose a single recipe with the highest calories
if (empty($filteredCombinations)) {
$selectedRecipe = Recipe::where('category', $category)->orderBy('calories', 'desc')->first();
$mealPlan[$category] = $selectedRecipe;
} else {
// Randomly select a combination from the filtered combinations
$selectedCombination = $filteredCombinations[array_rand($filteredCombinations)];
$mealPlan[$category] = $selectedCombination;
}
}
return $mealPlan;
}
// Example usage
$dailyCalories = 1500;
$dailyCaloriesMin = 1300;
$mealPlan = getDailyMealPlan($dailyCalories);
print_r($mealPlan);
但是我得到了一个“true”而不是一个对象。
如果我去掉最低卡路里就可以了,但总卡路里数往往低于1300:
// Function to filter combinations by total calories
function filterCombinationsByCalories($combinations, $dailyCalories) {
return array_filter($combinations, function($combination) use ($dailyCalories) {
$totalCalories = array_sum(array_column($combination, 'calories'));
return $totalCalories <= $dailyCalories;
});
}
有什么解决办法吗?
use App\Models\Recipe;
function generateCombinations($items, $n, $start = 0, $result = [], &$results = []) {
if ($n === 0) {
$results[] = $result;
return;
}
for ($i = $start; $i < count($items); $i++) {
$result[] = $items[$i];
generateCombinations($items, $n - 1, $i + 1, $result, $results);
array_pop($result);
}
}
function filterCombinationsByCalories($combinations, $dailyCaloriesMin, $dailyCalories) {
return array_filter($combinations, function($combination) use ($dailyCaloriesMin, $dailyCalories) {
$totalCalories = array_sum(array_column($combination, 'calories'));
return $totalCalories >= $dailyCaloriesMin && $totalCalories <= $dailyCalories;
});
}
function getDailyMealPlan($dailyCalories, $dailyCaloriesMin) {
$mealCategories = ['breakfast', 'lunch', 'dinner', 'snacks'];
$mealPlan = [];
foreach ($mealCategories as $category) {
$recipes = Recipe::where('category', $category)->get()->toArray();
$combinations = [];
generateCombinations($recipes, $category === 'snacks' ? 1 : 2, 0, [], $combinations);
$filteredCombinations = filterCombinationsByCalories($combinations, $dailyCaloriesMin, $dailyCalories);
if (empty($filteredCombinations)) {
$selectedRecipe = Recipe::where('category', $category)->orderBy('calories', 'desc')->first();
$mealPlan[$category] = $selectedRecipe;
} else {
$selectedCombination = $filteredCombinations[array_rand($filteredCombinations)];
$mealPlan[$category] = $selectedCombination;
}
}
return $mealPlan;
}
// Example usage
$dailyCalories = 1500;
$dailyCaloriesMin = 1300;
$mealPlan = getDailyMealPlan($dailyCalories, $dailyCaloriesMin);
print_r($mealPlan);
您提供的代码似乎旨在根据指定的每日热量摄入量生成每日膳食计划。然而,有几个问题需要解决:
在这个修订版本中,我做了以下更改: