【发布时间】: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