Php 组合4个元素(嵌套循环)
在数据库中,我有一份膳食清单。在任何给定类型的食物中,我都吃一餐(1-早餐、2-早餐、3-午餐、4-晚餐),以及蛋白质、碳水化合物和脂肪(均以克计)。我必须使每一餐都与每一餐相匹配,以获得一天的完整饮食。一顿饭作为一种膳食类型存储在数据库中,例如,“1,2,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
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;
}
}
}
}