Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 组合4个元素(嵌套循环)_Php_Mysql_Loops_Nested - Fatal编程技术网

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

Php 组合4个元素(嵌套循环),php,mysql,loops,nested,Php,Mysql,Loops,Nested,在数据库中,我有一份膳食清单。在任何给定类型的食物中,我都吃一餐(1-早餐、2-早餐、3-午餐、4-晚餐),以及蛋白质、碳水化合物和脂肪(均以克计)。我必须使每一餐都与每一餐相匹配,以获得一天的完整饮食。一顿饭作为一种膳食类型存储在数据库中,例如,“1,2,4”-可用于除晚餐以外的所有膳食。我做了这样的事情: foreach ($meal1 as $row1) { foreach ($meal2 as $row2) { foreach ($meal3 as $ro

在数据库中,我有一份膳食清单。在任何给定类型的食物中,我都吃一餐(1-早餐、2-早餐、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秒(难怪)。一万顿饭之后会发生什么?你有没有什么办法把它做好并达到最佳状态?$meal1、$meal2、$meal3、$meal4包含膳食查询,以过滤膳食类型(早餐、第二早餐、午餐、晚餐)。我需要这样一个表格当我把每顿饭和每顿饭联系起来时,我计算了有多少顿饭含有蛋白质、碳水化合物和脂肪,以及它将如何丢失,例如,一顿饭中有20克蛋白质满足日常需求,到了晚餐,我会给零食(如酸奶、香蕉等)

嗯,有人想出了一个最佳的游戏,即不必添加零食的定量餐?在数据库中,膳食有重量(克)、热值(千卡)和蛋白质(克)、碳水化合物(克)和脂肪(克)。但是这个选择我知道这可能是最难的,所以请在这个选择上帮忙(吃零食),除非有人对第二个选择有想法,否则它会很好

提前感谢您的帮助

@编辑:

数据库方案:

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 ;
代码:


如果“$meal1、$meal2、$meal3、$meal4包含餐食查询以过滤餐食类型”,则发布完整的代码片段、数据库模式和原始数据示例,但不一定连接(例如,$meal2不依赖于$meal1,您可以按顺序获取它们,而不是将它们放入循环中。尽可能避免循环查询。就性能而言,最好从数据库中获取更大(未过滤)的结果(并在php中过滤)而不是从循环查询中获取它们。我添加了数据库模式和代码。规范化您的设计
$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;
            }
        }
    }
}