База данных выглядит следующим образом:
Рецепты
Категория
Калории
Яйца
завтрак
180
Йогурт< /td>
завтрак
50
Яблоко пирог
закуски
289
Банановый пирог
закуски
386
Томатная паста
обед
712
Салат с курицей
обед
956
Овощной суп
ужин
410
< tr>
Рыба с картофелем
ужин
652
Я хотел бы получать дневное питание в соответствии со среднесуточной калорийностью.
Например, если моя ежедневная калорийность составляет 1500 ккал, я хочу получить на день 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 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);
Это сработает, если я удалю минимальное количество калорий, но общее количество калорий часто будет меньше более 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
Подробнее здесь: [url]https://stackoverflow.com/questions/78390627/laravel-array-result-is-true-instead-object[/url]
Мобильная версия