首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环数组值

循环数组值
EN

Stack Overflow用户
提问于 2012-09-12 02:13:38
回答 5查看 172关注 0票数 0

在这里,我从DB表的行中访问'date‘键值。我可以呼应这些值,没问题。

代码语言:javascript
复制
$res = $mysqli->query("SELECT * FROM alfred ORDER BY id ASC");
$row = $res->fetch_all(MYSQLI_ASSOC);

foreach ($row as $key => $value){
    $availDate = $value['date'];
    echo $availDate.'<br />';
}

上面的循环显示了来自DB的所有'date‘值,在本例中有3个日期- "2012-09-25“"2012-09-27”和"2012-09-29“。但是,我需要将这些“日期”值与下面代码中的$date->format('Y-m-d')值进行比较,并将具有相应“忙”或“可用”状态的每个日期显示到表的单独<td>中。我下面的版本只比较“日期”键的“最后”值- "2012-09-29",但我需要比较上面数组中的每个“日期”值,它也意味着"2012-09-25“和"2012-09-27”。我尝试了许多版本,但仍然不成功。有什么想法吗?

代码语言:javascript
复制
$date = new DateTime();
$endDate = new DateTime('+10 day');
for($date->format('Y-m-d'); $date->format('Y-m-d') < $endDate->format('Y-m-d'); $date->modify('+1 day')){
    if ($date->format('Y-m-d') == $availDate){
    echo '<td>'.$date->format('Y-m-d/D').' busy</td>';
    }   else {
        echo '<td>'.$date->format('Y-m-d/D').' available</td>';
        }
}

这是我现在得到的结果:

代码语言:javascript
复制
2012-09-21/Fri available 2012-09-22/Sat available 2012-09-23/Sun available 2012-09-24/Mon available 2012-09-25/Tue available 2012-09-26/Wed available 2012-09-27/Thu available 2012-09-28/Fri available 2012-09-29/Sat busy 2012-09-30/Sun available

但实际上我需要在"2012-09-25“的<td>和"2012-09-27”的<td>中显示"busy“状态,因为这些也是存在于$row数组中的”Date值“。不幸的是,我不能在这里张贴任何图片来展示,但我希望我上面的结果能给你带来灵感。

在下面in_array的帮助下解决了:

代码语言:javascript
复制
$aAvailDate = array();
foreach ($row as $key => $value){
        $aAvailDate[] = $value['date'];
}
$date = new DateTime();
    $endDate = new DateTime('+10 day');
    for($date->format('Y-m-d'); $date->format('Y-m-d') < $endDate->format('Y-m-d'); $date->modify('+1 day')){
        if (in_array($date->format('Y-m-d'), $aAvailDate)){
        echo '<td>'.$date->format('Y-m-d/D').' busy</td>';
        }     else {
            echo '<td>'.$date->format('Y-m-d/D').' available</td>';
            }
    }
EN

回答 5

Stack Overflow用户

发布于 2012-09-12 02:22:45

我还没有测试您的代码,但我认为您在这里运行->format('Y-m-d')是不必要的,这会扰乱您的逻辑。

每次运行时,PHP都会将对象转换为字符串,然后将其与其他字符串进行比较。这不会做任何有用的事情。

相反,您应该使用the DateTime class的功能来比较对象本身。只有在输出到浏览器、输出到SQL查询等时,才需要使用format()方法。

票数 0
EN

Stack Overflow用户

发布于 2012-09-12 02:27:06

虽然你的问题不清楚,但AFAIK

如果可用日期出现在给定日期之间,则显示“忙”,否则显示“空闲”。

我建议你使用MySQL (未测试)来做这件事

代码语言:javascript
复制
SELECT *,
IF( `DateCol` BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 3 WEEK), 'Busy','Free') 
AS status
FROM TableName
票数 0
EN

Stack Overflow用户

发布于 2012-09-12 02:27:59

尝试使用while循环而不是foreach。另外,直接比较DateTime对象,而不是格式化字符串。

代码语言:javascript
复制
$date = new DateTime();
$endDate = new DateTime('+3 week');

while( $date < $endDate) {
    if ($date->format('Y-m-d') == $availDate){
        echo '<td class="busy">busy</td>';
    } else {
        echo '<td>free</td>';
    }
    $date->modify("+1 day");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12375528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档