Php 达到循环内循环内循环的内存限制

Php 达到循环内循环内循环的内存限制,php,mysql,loops,Php,Mysql,Loops,免责声明:我知道我的代码中有不推荐使用的mysql函数。这在我的待办事项清单上 我有一个MySql选择给我一个房子预订系统中不同项目的季节 种类: Low season: 2010-01-01, 2010-03-01, 100 //meaning start,end,price 这是我的第一个sql: while($season_row=mysql_fetch_assoc($season_res)){ $seasonsArray[$season_row['id_item']][] =

免责声明:我知道我的代码中有不推荐使用的mysql函数。这在我的待办事项清单上

我有一个MySql选择给我一个房子预订系统中不同项目的季节

种类:

Low season: 2010-01-01, 2010-03-01, 100 //meaning start,end,price
这是我的第一个sql:

while($season_row=mysql_fetch_assoc($season_res)){
    $seasonsArray[$season_row['id_item']][] = array(
        $season_row['season_start'], 
        $season_row['season_end'],
        $season_row['daily_price']
    );
}
此处定义了日期(到达函数的日期为
YYYY-mm-dd
):

现在我需要在两个日期之间循环,在
$seasuresarray
的项目之间循环,然后检查该项目在特定日期的价格

我是这样做的:

foreach($seasonsArray as $item=>$value){            
    for( $thisDay = $start; $thisDay < $end; $thisDay = $thisDay + 86400){

        foreach($value as $innerValue){     
            $season_start = roundToSeconds($innerValue[0]);
            $season_end = roundToSeconds($innerValue[1]);
            if($thisDay >= $season_start && $thisDay <= $season_end) {  
                $foundPrice[] = round($innerValue[2]);
            }
        }

        $thisSerie[] = array($thisDay * 1000, isset($foundPrice) ? $foundPrice[0] : 0);

        // security check to avoid double assigned seasons to same day
        if(count($foundPrice) > 1){ die('There is double bookings in item: '.$item);}   

        unset($foundPrice);
    }
    $seasonPrices[] = array(
        'data'=> $thisSerie,
        'label'=> 'House ID: '.$item, 
    );  
}
foreach($sitemsarray as$item=>$value){
对于($thisDay=$start;$thisDay<$end;$thisDay=$thisDay+86400){
foreach($value作为$innerValue){
$seasure_start=roundToSeconds($innerValue[0]);
$seasure_end=roundToSeconds($innerValue[1]);
如果($thisDay>=$seasure\u start&&$thisDay 1){die('item:'.$item中有双重预订);}
未结算($foundPrice);
}
$Precises[]=数组(
“数据”=>$thisSerie,
“标签”=>“房屋ID:”。$item,
);  
}
但我得到:
致命错误:允许的内存大小100663296字节已用尽


有什么建议可以改进我的代码,使其不需要这么多内存吗?或者是有一个bug,但我看不到它吗?

看起来你永远不会离开for循环。在哪里设置$start和$end。通过打印它们来验证它们的值

就优化而言,不需要每天循环。跳过计算天数的for循环,使用$seasure\u start和$seasure\u end计算第二个foreach循环中的日期


事实上,现在有一个bug,除非$session\u start和$session\u end总是相隔一天以上,因为有时事件会发生在您循环的24小时周期之间。

我会生成一系列天,并根据您的季节表加入,并使用单个查询来获得所需的结果集,例如:

SELECT dates.Date,
       coalesce(s.price, 0) AS price
FROM
  (SELECT a.Date
   FROM
     ( SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date, '0' AS price
      FROM
        (SELECT 0 AS a
         UNION ALL SELECT 1
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
         UNION ALL SELECT 5
         UNION ALL SELECT 6
         UNION ALL SELECT 7
         UNION ALL SELECT 8
         UNION ALL SELECT 9) AS a
      CROSS JOIN
        (SELECT 0 AS a
         UNION ALL SELECT 1
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
         UNION ALL SELECT 5
         UNION ALL SELECT 6
         UNION ALL SELECT 7
         UNION ALL SELECT 8
         UNION ALL SELECT 9) AS b
      CROSS JOIN
        (SELECT 0 AS a
         UNION ALL SELECT 1
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
         UNION ALL SELECT 5
         UNION ALL SELECT 6
         UNION ALL SELECT 7
         UNION ALL SELECT 8
         UNION ALL SELECT 9) AS c) a
   WHERE a.Date BETWEEN '$from' AND '$to'
   ORDER BY a.Date) dates
LEFT JOIN seasons s ON dates.Date BETWEEN s.start AND s.END

复杂的内部查询避免了创建临时表(取自)并且可以工作1000天,但是创建临时表就可以了。

你在用seasons数组做什么?也许你已经可以用sql查询或至少部分sql查询来简化它了,3嵌套的for看起来不好do@arieljuodseasons数组只是从sql查询中收集数据季节,比如每年4/5个,有一个开始,有一个结束,在这段时间里有一天的价格。同意3loops=不好,但没有更好的方法…你能发布一个你从数据库获得的数据和你在循环结束时想要的数据的例子吗?你不清楚你想用这些循环做什么,也许一个例子可以帮助你。我猜你可以简化循环做更好的查询,但我不明白你到底想要什么end@arieljuod,当然可以。让我知道这是否有帮助:-谢谢你看这个。不清楚的部分是你想用那个数据做什么,那个循环在seasonPrice函数内?seasonPrice返回什么?你希望用那个输入输出什么?谢谢你看这个。我不知道我怎么能跳过日循环。我从sql中得到的季节只有日开始和结束,就像每个季节有3/4个月。因此,每年有4/5个月的开始和结束,在这期间有一天的价格。谢谢你看这个!我一直在看你的答案并试图理解它:)我觉得你的答案会上升当我完全理解它时,给我的知识打分。如果你想在代码中添加一些东西,那就太好了。不管怎样,我真的很高兴有这个建议来学习和学习。谢谢!
SELECT dates.Date,
       coalesce(s.price, 0) AS price
FROM
  (SELECT a.Date
   FROM
     ( SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date, '0' AS price
      FROM
        (SELECT 0 AS a
         UNION ALL SELECT 1
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
         UNION ALL SELECT 5
         UNION ALL SELECT 6
         UNION ALL SELECT 7
         UNION ALL SELECT 8
         UNION ALL SELECT 9) AS a
      CROSS JOIN
        (SELECT 0 AS a
         UNION ALL SELECT 1
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
         UNION ALL SELECT 5
         UNION ALL SELECT 6
         UNION ALL SELECT 7
         UNION ALL SELECT 8
         UNION ALL SELECT 9) AS b
      CROSS JOIN
        (SELECT 0 AS a
         UNION ALL SELECT 1
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
         UNION ALL SELECT 5
         UNION ALL SELECT 6
         UNION ALL SELECT 7
         UNION ALL SELECT 8
         UNION ALL SELECT 9) AS c) a
   WHERE a.Date BETWEEN '$from' AND '$to'
   ORDER BY a.Date) dates
LEFT JOIN seasons s ON dates.Date BETWEEN s.start AND s.END