组合4个元素(嵌套循环)

时间:2015-05-24 12:07:17

标签: php mysql loops nested

在数据库中,我有一份餐食清单。在任何给定类型的食物中,我一餐(1 - 早餐,2 - II早餐,3 - 午餐,4 - 晚餐),以及膳食中存在的蛋白质,碳水化合物和脂肪(均以克为单位)。我必须在每餐中搭配每餐,以获得当天的全面饮食。一餐作为一种膳食存储在数据库中,例如," 1,2,4" - 可用于除晚餐外的所有餐点。我做了类似的事情:

foreach ($meal1 as $row1)
{
    foreach ($meal2 as $row2)
    {
        foreach ($meal3 as $row3)
        {
            foreach ($meal4 as $row4)
            {
                // Here merge operations meals and entry to the array
            }
        }
    }
}

数据库只包含100餐,脚本执行时间超过10秒(难怪)。当它是10000餐时会发生什么?你有什么想法做得好和最佳吗? $ meal1,$ meal2,$ meal3,$ meal4包括用餐过滤查询以过滤餐点类型(早餐,第二早餐,午餐,晚餐)。当我每顿饭与每顿饭连在一起时,我需要这样一种形式,我计算了多少餐中含有蛋白质,碳水化合物和脂肪以及它将如何丢失,例如,每餐需要20克蛋白质,以及晚餐,我会给小吃(例如酸奶,香蕉等)。

那么,有人想知道一个最佳的游戏方法,不需要添加零食的基础重量吗?在数据库中,膳食具有重量(克),热值(千卡)和蛋白质(以克为单位),碳水化合物(以克为单位)和脂肪(克)。但是这个选项我知道可能是最难的,所以请帮助这个选项(带小吃),除非有人对第二个选项有所了解,否则会很棒。

提前感谢您的帮助。

@edit:

数据库方案:

CREATE TABLE IF NOT EXISTS `recipes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_bin NOT NULL,
  `type` varchar(7) COLLATE utf8_bin NOT NULL,
  `weight` int(11) NOT NULL,
  `kcal` int(11) NOT NULL,
  `protein` int(11) NOT NULL,
  `carbohydrates` int(11) NOT NULL,
  `fats` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 ;

代码:

$proteinPerDay = 229;
$carbohydratesPerDay = 229;
$fatsPerDay = 51;

$result_1 = $db->query("SELECT * FROM recipes WHERE type LIKE '%1%'");
while ($data_1 = $result_1->fetch_assoc())
{
    $meal_1[] = $data_1;
}

$result_2 = $db->query("SELECT * FROM recipes WHERE type LIKE '%2%'");
while ($data_2 = $result_2->fetch_assoc())
{
    $meal_2[] = $data_2;
}

$result_3 = $db->query("SELECT * FROM recipes WHERE type LIKE '%3%'");
while ($data_3 = $result_3->fetch_assoc())
{
    $meal_3[] = $data_3;
}

$result_4 = $db->query("SELECT * FROM recipes WHERE type LIKE '%4%'");
while ($data_4 = $result_4->fetch_assoc())
{
    $meal_4[] = $data_4;
}

$diet = array();
foreach ($meal_1 as $row1)
{
    foreach ($meal_2 as $row2)
    {
        if ($row1 == $row2)
        {
            continue;
        }

        foreach ($meal_3 as $row3)
        {
            if ($row1 == $row3 || $row2 == $row3)
            {
                continue;
            }

            foreach ($meal_3 as $row4)
            {
                if ($row1 == $row4 || $row2 == $row4 || $row3 == $row4)
                {
                    continue;
                }

                $proteinPerDayFind = $row1['protein'] + $row2['protein'] + $row3['protein'] + $row4['protein'];
                $carbohydratesPerDayFind = $row1['carbohydrates'] + $row2['carbohydrates'] + $row3['carbohydrates'] + $row4['carbohydrates'];
                $fatsPerDayFind = $row1['fats'] + $row2['fats'] + $row3['fats'] + $row4['fats'];

                // I check to see whether the protein, fats and carbohydrates are sufficient. If something is not enough for the daily demand, it will add snacks.

                $diet[$row1['id'] . $row2['id'] . $row3['id'] . $row4['id']][0] = $row1;
                $diet[$row1['id'] . $row2['id'] . $row3['id'] . $row4['id']][1] = $row2;
                $diet[$row1['id'] . $row2['id'] . $row3['id'] . $row4['id']][2] = $row3;
                $diet[$row1['id'] . $row2['id'] . $row3['id'] . $row4['id']][3] = $row4;
            }
        }
    }
}

0 个答案:

没有答案