【问题标题】:Using functions and while loops together in PHP在 PHP 中一起使用函数和 while 循环
【发布时间】:2012-01-27 19:14:57
【问题描述】:

好的,所以我知道一个函数只能创建一次,但我需要使用数组中的值的输出在同一页面上运行该函数 3 次。我已经把它设置好了,因为我认为它应该可以工作,但是 php 只会产生一个空白页面。这是我使用它之前的原始功能:

function time_ago($date,$granularity=2) {
    $date = strtotime($date);
    $difference = time() - $date;
    $periods = array('decade' => 315360000,
        'year' => 31536000,
        'month' => 2628000,
        'week' => 604800, 
        'day' => 86400,
        'hour' => 3600,
        'minute' => 60,
        'second' => 1);
    if ($difference < 5) { // less than 5 seconds ago, let's say "just now"
        $retval = "posted just now";
        return $retval;
    } else {                            
        foreach ($periods as $key => $value) {
            if ($difference >= $value) {
                $time = floor($difference/$value);
                $difference %= $value;
                $retval .= ($retval ? ' ' : '').$time.' ';
                $retval .= (($time > 1) ? $key.'s' : $key);
                $granularity--;
            }
            if ($granularity == '0') { break; }
        }
        return ' posted '.$retval.' ago';      
    }
}

然后这是我的基本循环,旨在从数据库中提取推文并将时间戳转换为 unix 时间:

$sql = $db->select("SELECT * FROM `Twitter_tweets` ORDER BY `id` DESC LIMIT 0, 3");

while($res = $db->get_row($sql))
        {
            $p .= '
                <li>
                    <span class="tweetContent">'.display_clean($res['tweet']).'</span>
                    <br />
                    <span class="tweetDate">';

            $timeSince = ceil(abs(display_clean($res['created_at']) - time()) / 86400);

            $p .= ''.$timeSince.'</span>

                </li>
            ';
        }

以下代码的想法是取数据库中的日期,转换为 unixtime,找出两者之间的差异,然后将其输出为 'posted x minutes ago',例如 facebook/twitter 等:

//loop section converting date to 'posted x time ago'


$sql = $db->select("SELECT * FROM `Twitter_tweets` ORDER BY `id` DESC LIMIT 0, 3");

function time_ago($date,$granularity=2) {
    $date = strtotime($date);
    $difference = time() - $date;
    $periods = array('decade' => 315360000,
        'year' => 31536000,
        'month' => 2628000,
        'week' => 604800, 
        'day' => 86400,
        'hour' => 3600,
        'minute' => 60,
        'second' => 1);
}

    while($res = $db->get_row($sql))
        {
            $p .= '
                <li>
                    <span class="tweetContent">'.display_clean($res['tweet']).'</span>
                    <br />
                    <span class="tweetDate">';

            $date = display_clean($res['created_at']);

            if ($difference < 5) { // less than 5 seconds ago, let's say "just now"
                $retval = "posted just now";
                return $retval;
            } else {                            
                foreach ($periods as $key => $value) {
                    if ($difference >= $value) {
                        $time = floor($difference/$value);
                        $difference %= $value;
                        $retval .= ($retval ? ' ' : '').$time.' ';
                        $retval .= (($time > 1) ? $key.'s' : $key);
                        $granularity--;
                    }
                if ($granularity == '0') { break; }
                }
                return ' posted '.$retval.' ago';      
            }



            $p .= '</span>

                </li>
            ';
        }



//end loop

谁能指出我哪里出错了?我可以使用 php,但无论如何我都不是专家。我只是看不到哪里出错并导致输出空白文件。

【问题讨论】:

  • DateTime Interval 比这么多代码更容易使用
  • 你的数据库中 created_at 是什么数据类型,display_clean() 有什么作用? $difference 在你的主循环中定义在哪里(它只存在于函数中)?
  • 你的函数没有做任何事情,除了创建一堆函数局部变量(函数外不可见)
  • @MarkBaker 代码的重点是将其显示在“x 分钟前发布”中,DateTime Interval 是否允许我实现这一点? created_at 存储为日期时间(我无法影响), display_clean() 是一个自定义函数,它执行诸如 stripslashes() 之类的操作,并且 $difference 不会出现在实际循环中。就像我说的,我在 php 方面绝对不胜任,只是热衷于学习。
  • 使用 DateTime 对象并执行 diff() 将为您提供一个 Interval 对象,然后可以轻松地对其进行格式化...但是查看您的代码,我认为您需要了解更多关于如何在您准备好对象之前,函数工作和变量范围

标签: php function date while-loop


【解决方案1】:

为什么不直接调用原始函数并打印出结果呢?

$sql = $db->select("SELECT * FROM `Twitter_tweets` ORDER BY `id` DESC LIMIT 0, 3");

while($res = $db->get_row($sql))
        {
            $p .= '
                <li>
                    <span class="tweetContent">'.display_clean($res['tweet']).'</span>
                    <br />
                    <span class="tweetDate">';

            $p .= ''.time_ago($res['created_at']).'</span>

                </li>
            ';
        }

【讨论】:

    【解决方案2】:

    我不太了解您的代码,但我认为其中存在重大语法错误。 如果它是一个函数,也许你想要这样:

    function time_ago($date,$granularity=2) {
        $sql = $db->select("SELECT * FROM `Twitter_tweets` ORDER BY `id` DESC LIMIT 0, 3");
        $date = strtotime($date);
        $difference = time() - $date;
        $periods = array('decade' => 315360000,
            'year' => 31536000,
            'month' => 2628000,
            'week' => 604800, 
            'day' => 86400,
            'hour' => 3600,
            'minute' => 60,
            'second' => 1); 
        while($res = $db->get_row($sql))
            {
                $p .= '
                    <li>
                        <span class="tweetContent">'.display_clean($res['tweet']).'</span>
                        <br />
                        <span class="tweetDate">';
    
                $date = display_clean($res['created_at']);
    
                if ($difference < 5) { // less than 5 seconds ago, let's say "just now"
                    $retval = "posted just now";
                    return $retval;
                } else {                            
                    foreach ($periods as $key => $value) {
                        if ($difference >= $value) {
                            $time = floor($difference/$value);
                            $difference %= $value;
                            $retval .= ($retval ? ' ' : '').$time.' ';
                            $retval .= (($time > 1) ? $key.'s' : $key);
                            $granularity--;
                        }
                    if ($granularity == '0') { break; }
                    }
                    return ' posted '.$retval.' ago';      
                }
                $p .= '</span>
    
                    </li>
                ';
            }
    }
    

    我没有测试它,即使我想我也做不到。也许会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 2015-08-06
      相关资源
      最近更新 更多