Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.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 使用嵌套循环中的数组耗尽内存_Php_Mysql_Multidimensional Array_Out Of Memory_Nested Loops - Fatal编程技术网

Php 使用嵌套循环中的数组耗尽内存

Php 使用嵌套循环中的数组耗尽内存,php,mysql,multidimensional-array,out-of-memory,nested-loops,Php,Mysql,Multidimensional Array,Out Of Memory,Nested Loops,这就是我得到的错误 致命错误:已耗尽允许的内存大小 我正在获取包含日期from和日期till的数组。我正在尝试获取中间的所有日期,并将它们添加到新数组中。显然,嵌套的循环和多个数组很累人 我需要一种不那么累人的方式来安排所有的约会 这是我的代码: $query = "SELECT * FROM reservate ORDER BY from"; $result = $connect->query($query); $reservations = a

这就是我得到的错误

致命错误:已耗尽允许的内存大小

我正在获取包含日期
from
和日期
till
的数组。我正在尝试获取中间的所有日期,并将它们添加到新数组中。显然,嵌套的循环和多个数组很累人

我需要一种不那么累人的方式来安排所有的约会

这是我的代码:

$query = "SELECT *
          FROM reservate
          ORDER BY from";
$result = $connect->query($query);

$reservations = array();
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        $reservations[] = $row;
    }
}

$connect->close();

//AVAILABILITY CHECK
$nonAvailable = array();
foreach($reservations as $reservation){
    $from = $reservation['from'];
    $till = $reservation['till'];

    while($from <= $till){
        $nonAvailable[] = $from;
        $from = date('Y-m-d', strtotime("+1 days"));
    }
}
$query=“选择*
从保留地
“从……订购”;
$result=$connect->query($query);
$reservations=array();
如果($result->num_rows>0){
而($row=$result->fetch_assoc()){
$reservations[]=$row;
}
}
$connect->close();
//可用性检查
$nonAvailable=array();
foreach($reservationas$reservation){
$from=$reservation['from'];
$till=$reservation['till'];

而($from看起来你做了一个无限循环1

仍有一些改进需要改进:

  • 在以下示例中,不会将整个表复制到
    reservation
    array,我们只检索需要的列 从桌子上。
  • 比较
    整数
    而不是
    字符串
  • 手动将
    1
    天添加到
    $from
    中,而不是依靠
    strotime
    来完成。
$query=“从中选择,直到
从保留地
“从……订购”;
$result=$connect->query($query);
$nonAvailable=array();
如果($result->num_rows>0){
而($row=$result->fetch_assoc()){
$from=STROTIME($row['from']);
$till=strottime($row['till']);
而($from close();
这个算法可能会变得更有效。例如,您是否需要一份每天保留内容的详尽列表?如果不需要,那么只需要开始日期和结束日期就足够了



1给定足够的时间和内存,循环将退出,因为
strotime(“+1天”)
最终将返回一个大于
$till

的值,这是一种仅使用单个查询的替代方法

这将获取您的预订表,并使用两个子查询将其交叉连接,每个子查询获取数字范围。每个子查询获取数字0到9,一个用作单位,一个用作十。将它们组合在一起,可以得到数字0到99(因此99天范围)

WHERE子句只是检查from date(van)加上天数(从0到99)是否小于或等于to date(tot)。因此,一个房间(我假设有多个房间,或一些其他项目正在被预订)在预订的每个日期都被推出:-

SELECT room, DATE_ADD(van, INTERVAL (tens.i * 10 + units.i) DAY) AS non_available
FROM reservate
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
WHERE DATE_ADD(van, INTERVAL (tens.i * 10 + units.i) DAY) <= tot
ORDER BY room, non_available
选择房间、日期添加(厢式货车、间隔时间(10.i*10+units.i)天)不可用
从保留地
交叉联接(当i联合选择1联合选择2联合选择3联合选择4联合选择5联合选择6联合选择7联合选择8联合选择9时选择0)单位
交叉联接(当i并集选择1并集选择2并集选择3并集选择4并集选择5并集选择6并集选择7并集选择8并集选择9时选择0)十位数

其中日期加上(货车,间隔(十个一乘十个一乘十个单位)天)虽然我认为@robbmj已经发现了这个问题,但这些日期范围有多大?它们的用途是什么?如果您只是在进一步的查询中查找不可用的日期,那么通过SQL查询可能只返回不可用的日期。我测试的日期范围大约为8天。最终它将不得不处理日期范围最长可能为2个月。至于sql,我还没有花太多的精力学习更多的基础知识。我最终的目标是:我有一个生成的日历,我想突出显示不可用的日期。我或多或少地让它工作了,但不得不做一些更改。我会写一个额外的答案给你一些想法,尽管已经被接受的答案是您实际问题的完美答案。@iDobbler,不用担心,我很乐意提供帮助。我更新了答案,并提供了一些您可能感兴趣的提示,请看一看。感谢您的建议。今天对我来说不是一个好日子xD。我采用了全新的方法,制作了一个不同的功能及其功能现在工作很好。
while ($from <= $till){
     $nonAvailable[] = $from;
     // add 1 day to $from
     $from = date('Y-m-d', strtotime($from, "+1 days"));
}
$query = "SELECT from, till
          FROM reservate
          ORDER BY from";
$result = $connect->query($query);

$nonAvailable = array();

if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $from = strtotime($row['from']);
        $till = strtotime($row['till']);

        while ($from <= $till) {
            $nonAvailable[] = date('Y-m-d', $from);
            $from += 60*60*24;
        }
    }
}

$connect->close();
SELECT room, DATE_ADD(van, INTERVAL (tens.i * 10 + units.i) DAY) AS non_available
FROM reservate
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
WHERE DATE_ADD(van, INTERVAL (tens.i * 10 + units.i) DAY) <= tot
ORDER BY room, non_available