Laravel:数组结果是“true”而不是对象

问题描述 投票:0回答:1

我正在使用 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;
    });
}

有什么解决办法吗?

php laravel
1个回答
0
投票
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);

您提供的代码似乎旨在根据指定的每日热量摄入量生成每日膳食计划。然而,有几个问题需要解决:

  1. 在filterCombinationsByCalories函数中,您使用 $dailyCaloriesMin,这似乎是未定义的。它应该是 作为参数传递。
  2. getDailyMealPlan 函数尝试使用多维 数组来存储膳食计划,但它没有考虑实际情况 配方对象。它应该存储配方对象而不是 数组。
  3. 函数generateCombinations正在生成以下组合 每个膳食类别的长度为 1,这可能不是您想要的 故意的。它应该生成不同长度的组合, 例如 1 个早餐食谱,2 个午餐食谱等

在这个修订版本中,我做了以下更改:

  • 修复了 $dailyCaloriesMin 的问题。
  • 更改了不同膳食类别的组合生成方式。 零食现在是单独选择的,而其他类别则有 2 种食谱的组合。
  • 将所选食谱正确存储在膳食计划中。
© www.soinside.com 2019 - 2024. All rights reserved.