替代ob_get_contents();?

时间:2014-12-17 09:43:50

标签: php

有一个案例,我试图比较和使用两个变量,但首先需要从日期戳创建和格式化。

目前,如果我使用:

    ob_start();
    echo date_i18n('d M Y', $date_start);
    $start = ob_get_contents();
    ob_end_clean();

我可以实现我想要的。但是,当我尝试添加第二个变量时,$date_end(和一个条件)我得到了奇怪的行为。所以我的想法是在同一个函数中使用它两次不是犹太教。这是我试过的:

if( $date_start == $date_end ) {

    ob_start();
    echo date_i18n('d M Y', $date_start);
    $start = ob_get_contents();
    ob_end_clean();

    $title = $start;

} else {

    ob_start();
    echo date_i18n('d M', $date_start);
    $start = ob_get_contents();
    ob_end_clean();

    ob_start();
    echo date_i18n('d M Y', $date_end);
    $end = ob_get_contents();
    ob_end_clean();

    $title = $start.' - '. $end;
}

基本上,如果$date_end不等于$date_start,则$start将正确输出,但$end将输出为今天的日期。如果$date_end等于$date_start,那么日期将显示为今天的日期。

实际上只使用一个日期就足够了我的项目,但我对替代方案很好奇,为什么我会这样做。

/ 修改 /

输入值为:

$date_start = strtotime(get_field('date_debut', $post_id));
$date_end = strtotime(get_field('date_fin', $post_id));

2 个答案:

答案 0 :(得分:0)

输出缓冲区有几种用法。其中之一是能够捕获将内容打印到标准输出(而不是返回)的函数和方法的输出。换句话说,这样的函数:

function foo(){
    echo 'bar!';
}

......而不是这个:

function foo(){
    return 'bar!';
}

我们不知道date_i18n()如何运作,但您回显其输出:

echo date_i18n('d M Y', $date_start);

所以我强烈怀疑你过度设计了一段可能只是的代码:

$start = date_i18n('d M Y', $date_start);

除此之外,PHP具有处理日期的特定类型(Unix时间戳和DateTime对象)。您不应该使用字符串来执行日期操作逻辑,就像您不会尝试添加onethree一样。

答案 1 :(得分:0)

这个怎么样:

$ts_start = strtotime( get_field( 'date_debut', $post_id ) );
$ts_end   = strtotime( get_field( 'date_fin', $post_id ) );

if ( $ts_start === $ts_end ) {
    $title = date_i18n( 'd M Y', $ts_start );
} else {
    $title = date_i18n( 'd M', $ts_start ) . ' - ' . date_i18n( 'd M Y', $ts_end );
}