0

我在使用 php 的 Web 服务中发现了一个问题,我的数据库中有一个事件(一条记录),持续了多天,例如,

2013-09-17 00:00:00 to 2013-09-20 23:59:59

四天,我想用四个不同的日期打印四次,比如,

event_date =  2013-09-17 00:00:00
event_date =  2013-09-18 00:00:00
event_date =  2013-09-19 00:00:00
event_date =  2013-09-20 00:00:00

但它总是打印最后一个日期,我循环打印 json 对象四次,它工作正常,但总是打印每个对象的最后一个日期,

我的预期输出应该是,

{

"id": "472",
"event_date": "2013-09-17 00:00:00",
"event_type": "MULTIPLE_DAYS",
"multiple_days_start_date": "2013-09-17 00:00:00",
"multiple_days_end_date": "2013-09-20 23:59:59"

}, {

"id": "472",
"event_date": "2013-09-18 00:00:00",
"event_type": "MULTIPLE_DAYS",
"multiple_days_start_date": "2013-09-17 00:00:00",
"multiple_days_end_date": "2013-09-20 23:59:59"

}, {

"id": "472",
"event_date": "2013-09-19 00:00:00",
"event_type": "MULTIPLE_DAYS",
"multiple_days_start_date": "2013-09-17 00:00:00",
"multiple_days_end_date": "2013-09-20 23:59:59"

}, {

"id": "472",
"event_date": "2013-09-20 00:00:00",
"event_type": "MULTIPLE_DAYS",
"multiple_days_start_date": "2013-09-17 00:00:00",
"multiple_days_end_date": "2013-09-20 23:59:59"

},

这是我的 json 对象输出,

{

"id": "1",
"event_date": "2013-09-19 00:00:00",
"event_type": "MULTIPLE_DAYS",
"multiple_days_start_date": "2013-09-17 00:00:00",
"multiple_days_end_date": "2013-09-20 23:59:59"

}

这是我的代码,

(foreach $events as $event)
if($event->event_type == 'MULTIPLE_DAYS') {
    $mul_start_date = substr($event->multiple_days_start_date, 8,2);
    $mul_end_date = substr($event->multiple_days_end_date, 8,2);
   for($mul_start_date; $mul_start_date<=$mul_end_date;) {
    $event->event_date = substr_replace($event->multiple_days_start_date, $mul_start_date, 8,2);
    $events[] = $event;
    $mul_start_date++;
   }
}
echo json_encode($events);

请任何帮助,

4

3 回答 3

1
$events[] = $event;

这就是您的代码中的问题。

$event->event_date包含您需要的日期,这就是您需要推入结果数组的日期。但截至目前,整个 JSON 对象正在被推送。

将其更改为:

$events[] = $event->event_date;

演示!


更新

经过讨论,您似乎正在尝试将 JSON 对象重新编码为 JSON 形式。如果是这样的话,JiminP 在评论中正确地解决了这个问题:

$event是一个对象,它的引用存储在数组中$events。因此,当将对象添加到数组并修改对象时,数组中的所有(相同)其他对象似乎都被修改了。

因此,要解决此问题,您只需将$event对象类型转换为数组:

$events[] = (array) $event;

不过,这可能不是最好的解决方案。无论如何,您更正的代码现在应该如下所示:

if($event->event_type == 'MULTIPLE_DAYS') 
{
    $mul_start_date = substr($event->multiple_days_start_date, 8,2);

    $mul_end_date = substr($event->multiple_days_end_date, 8,2);

    for($mul_start_date; $mul_start_date<=$mul_end_date;) 
    {
        $event->event_date = substr_replace($event->multiple_days_start_date, $mul_start_date, 8,2);
        $events[] = (array) $event;
        $mul_start_date++;

    }
    $encoded = json_encode($events, JSON_PRETTY_PRINT);
    echo $encoded;
}

注意:(JSON_PRETTY_PRINT自 PHP 5.4.0 起可用)仅用于格式化输出。编码的 JSON 存储在一个变量中,然后被回显。

演示!

于 2013-09-18T06:34:05.387 回答
1

尝试将对象类型转换为数组。

我希望这会有所帮助:改变

$events[] = $event; 

至:

$events[] = (array) $event;
于 2013-09-18T06:40:52.593 回答
0

尝试这个。将您的对象存储到数组变量中。然后你打印数组

    for($mul_start_date; $mul_start_date<=$mul_end_date;) {
        $event->event_date = substr_replace($event->multiple_days_start_date, $mul_start_date, 8,2);
        $everntdate[] = $event->event_date;        
        $mul_start_date++;
       }
echo "<pre>";
print_r($everntdate);

你的输出像这种格式

Array
(
    [0] => 2013-09-17 00:00:00
    [1] => 2013-09-18 00:00:00
    [2] => 2013-09-19 00:00:00
    [3] => 2013-09-20 00:00:00
)
于 2013-09-18T06:32:54.413 回答