【问题标题】:php foreach inside for statement problemsphp foreach里面for语句的问题
【发布时间】:2012-11-05 19:38:31
【问题描述】:

很抱歉,如果之前有人问过这个问题,但是我无法找到问题的答案。

我正在尝试用 PHP 为我的 Web 应用程序构建日历系统和日程安排系统,但在某个特定领域遇到了困难。

我有一个“for”语句,它将制定一天中从上午 12:00 开始到晚上 11:30 结束的时间

在这个 for 循环中,我有一个 foreach,我想回显数组中匹配特定时间的对象。

我尝试过的所有事情,包括使用 for、while 和 foreach 语句都没有显示我所追求的,这是时间旁边排列的事件。

这是我的代码

<?php
$tStart = strtotime($start_time);
$tEnd = strtotime($end_time);
$tNow = $tStart;

while($items = mysql_fetch_object($result)){
    $events[] = $items;
}

for($tNow=$tStart; $tNow<$tEnd; $tNow=strtotime('+30 minutes',$tNow)){
    // Time to color the rows to make it easier to read
    if(!isset($day_row)){
        $day_row = "0";
    }
    if(isset($day_row) && $day_row >= "2"){
        $day_row--;
    }
    else{ $day_row++; 
    }

    //This bit draws the first column.
    echo "<tr><td class=\"day_row".$day_row."\" width=\"70px\">".date("h:i A",$tNow)."</td>";

    // MySQL stuff is now here
    foreach($events as $e => $item){
        if($item->apnt_start == $tnow){
            $rowspan = ((strtotime($item->apnt_finish)-strtotime($item->apnt_start))/"1800");
            echo "<td class=\"day_row_apnt\" rowspan=\"$rowspan\">".$item->apnt_start."-".$item->apnt_finish." ".$item->apnt_brief."</td></tr>";
        }
    }
}
?>

目前我有一个页面
上午 12:00
上午 12:30
上午 01:00
上午 01:30
凌晨 02:00
02:30 AM
03:00 AM
03:30 AM
04:00 AM
04:30 AM
上午 05:00
05:30 AM

在我想要的约会时间旁边。

我正在尝试实现类似于http://mrbs.sourceforge.net/ 但是我无法使用他们的系统,因为我无法正确集成它,我尝试查看他们的代码,它似乎指向许多文件,我无法理解我所追求的功能。

如果这还不够清楚,请告诉我,我们会尝试进一步解释。

【问题讨论】:

  • 您的代码会产生什么结果,它与您要查找的内容有何不同?
  • 使用 if 语句在 foreach 循环下没有任何显示。似乎 $tNow 将停留在上午 12:00 并且不会前进。如果有事件,我如何让 $tNow 继续前进,以便 foreach 最终实现?

标签: php for-loop foreach


【解决方案1】:

您需要为以下变量定义和设置值:

$start_time = "09:00 AM";
$end_time = "11:30 PM";

另外你需要添加查询和数据库连接(上面while($items = mysql_fetch_object($result)){语句):

mysql_connect("hostname", "user", "password");
mysql_select_db("mydb");
$result = mysql_query("select * from mytable");

编辑: 您应该使用 while mysql_fetch_assoc 而不是 mysql_fetch_object。 替换

while($items = mysql_fetch_object($result)){

while($items = mysql_fetch_assoc($result)){

删除:$events[] = $items;

确保您的 while 语句在所有代码执行后结束(您在问题中列出的代码) - 右括号 }

【讨论】:

  • 对不起,我忘了提到我已经在另一个文件中设置了 $start_time 和 $end_time。我还有一个通用的 mysql.php,它定义了你所说的连接信息。我正在使用来自 mysql 的信息填充 $items,但是我最近的问题是信息与预定的时间不匹配。
  • 那么问题是什么?这是关于 HTML 输出的吗?想把它放在桌子上什么的?
  • 执行 print_r($events) 会得到以下数组 ( [0] => stdClass Object ( [apnt_id] => 6 [apnt_person] => 3 [apnt_date] => 2012-11-17 [apnt_start] => 00:00 [apnt_finish] => 00:30 [apnt_brief] => 测试 3 [apnt_description] => 测试描述 3 ) [1] => stdClass 对象 ( [apnt_id] => 4 [apnt_person] = > 3 [apnt_date] => 2012-11-17 [apnt_start] => 08:30 [apnt_finish] => 09:00 [apnt_brief] => 测试 1 [apnt_description] => 测试描述 1 ) [2] => stdClass对象 ( [apnt_id] => 5 [apnt_person] => 3 [apnt_date] => 2012-11-17 [apnt_start] => 12:00 我无法放入整个数组的详细信息。
  • 问题是 foreach 语句不断获得 12:00AM 的 $tNow 值,我希望它上升,以便最终该语句为真 $item->apnt_start = = $tnow)
  • 查看我的编辑答案;随时发布您的数据库表(从 MySQL 导出),以便我们对其进行全面测试 :-) 请避免发布您可能在数据表中拥有的任何私人数据...
【解决方案2】:

好的,这应该适合你。

<?php
    $tStart = strtotime($start_time);
    $tEnd = strtotime($end_time);
    $tNow = $tStart;

    echo '<table>';

    while($events = mysql_fetch_assoc($result)){
        for($tNow=$tStart; $tNow<$tEnd; $tNow=strtotime('+30 minutes',$tNow)){
        // Time to color the rows to make it easier to read
            if(!isset($day_row)){
                $day_row = "0";
            }
            if(isset($day_row) && $day_row >= "2"){
                $day_row--;
            }
            else{ $day_row++; 
            }

            //This bit draws the first column.
            echo "<tr><td class=\"day_row".$day_row."\" width=\"70px\">".date("h:i A",$tNow)."</td>";
            if(strtotime($events['apnt_start']) == $tNow) {     
                $rowspan = ((strtotime($events->apnt_finish)-strtotime($events->apnt_start))/"1800");
                echo "<td class=\"day_row_apnt\" rowspan=\"$rowspan\">".$events->apnt_start."-".$events->apnt_finish." ".$events->apnt_brief."</td></tr>";
            }
        } //end for
    } //end while
    echo '</table>';
?>

【讨论】:

  • 感谢 Salih0vicX,这几乎是正确的。时间出现在他们应该出现的地方,事件也应该出现,但是.....如果我当天有三个事件,我会在上午 12 点到 12 点的每次迭代中出现 1 次,每次 12 点到 12 点。我相信这一点是由于while语句,这是正确的吗?有没有办法让它在上午 12 点到 12 点进行 1 次迭代,并且在 1 次迭代中呈现 3 个事件?
【解决方案3】:

我要感谢为此问题提供建议的每个人,我终于通过添加另一个变量并使用将数组存储在数组中的方法来解决它。

最终代码看起来像

<?php
    $tStart = strtotime($start_time);
    $tEnd = strtotime($end_time);
    $tNow = $tStart;
    $events = array();
    $eas = "0"; // eas stands for Event Array Start. this will be used to cycle through the events in the array.
    while($items = mysql_fetch_assoc($result)){
        $events[] = $items;
    }

    for($tNow=$tStart; $tNow<$tEnd; $tNow=strtotime('+30 minutes',$tNow)){
        // Time to color the rows to make it easier to read
            if(!isset($day_row)){
                $day_row = "0";
            }
            if(isset($day_row) && $day_row >= "2"){
                $day_row--;
            }
            else{ $day_row++; 
            }

            //This bit draws the first column.
            echo "<tr><td class=\"day_row".$day_row."\" width=\"70px\">".date("h:i A",$tNow)."</td>";
        if(strtotime($events[$eas]['apnt_start']) == $tNow) {     
                $rowspan = ((strtotime($events[$eas]['apnt_finish'])-strtotime($events[$eas]['apnt_start']))/"1800");
                echo "<td class=\"day_row_apnt\" rowspan=\"$rowspan\" >".$events[$eas]['apnt_start']."-".$events[$eas]['apnt_finish']." ".$events[$eas]['apnt_brief']."</td></tr>";
                $eas++;
           }
            else{
                echo "<td class=\"day_row".$day_row."\"></td>";
            }
        } //end for
?>

通过使用变量 $eas,我可以通过最初将其设置为 0 来控制它将从哪个数字开始,然后当它找到一个具有匹配时间的条目时,它会通过 if 语句在末尾if 语句被赋予 $eas++ 以递增。

这证明了如果没有预约,$eas 将不会运行并且它不会增加,因此保留在最后增加的 $eas 上。

再次感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多