PHP - 从时间戳所在的位置选择数据

时间:2014-11-05 09:04:57

标签: php mysql sql pdo unix-timestamp

我有一段代码可以选择未来x天并打印出来。

然后我尝试从这些时间戳中选择数据,并相应地打印出来:

下面我选择将来应该循环的天数($max)以及有多少行/数据($data["cnt"]

    $stmt=$dbh->prepare("select round((expire - unix_timestamp()) / 86400) as days, count(*) as cnt from xeon_users_rented WHERE user_by=:username group by days;");
    $stmt->bindParam(":username",$userdata['username']);
    $stmt->execute();
    $data=$stmt->fetchAll();
    $max = max(array_map(function($d){
        return $d['days'];
    }, $data));

    $expireData = array();

然后我将在未来的几天内循环并将其打印出来:(假设$x = 10)

for($x = 0; $x <= $max; $x++){
  if ($data[$x]["cnt"] > 0){
    $expireData[]  = $data[$x]["cnt"];
  }else{
    $expireData[] = 0;
  }

    $stamp = strtotime('+'.$x.' day', time());
    $expireDays[] = date("Y/m/d", $stamp);

}
然后我打印出日期数据和数据:

<?php echo implode("', '", $expireDays); ?>
<?php echo implode("', '", $expireData); ?>

这给了我:

'2014/11/05', '2014/11/06', '2014/11/07', '2014/11/08', '2014/11/09', '2014/11/10', '2014/11/11', '2014/11/12', '2014/11/13', '2014/11/14', '2014/11/15'

和(其中每个数字代表该特定日期的值)

2,8,0,0,0,0,0,0,0,0

到目前为止一切顺利。这里唯一的问题是数据(2,8,0,0etc。)不正确。例如,它应该是:

0,0,2,0,0,0,8,0,0,0

我的问题是:如何打印出与时间戳(xeon_users_rented.expire)匹配的数据?

2 个答案:

答案 0 :(得分:1)

从我收集到的内容中,sql查询(例如)返回一个数组,如:

$data = array(
    array("days"=>232975857, "cnt"=> 4),
    array("days"=>232975867, "cnt"=> 10),
    array("days"=>232976689, "cnt"=> 0),
    array("days"=>232976688, "cnt"=> 2)
);

您的案例中的最大值为10.但是,请注意您的代码(如下):

$max = max(array_map(function($d){
    return $d['days'];
}, $data));

可能会返回很多PHP E_NOTICE 错误而且速度很慢,因为你在该阶段的unix_timestamp中计算出最大值,例如232975867(我怀疑你需要的循环太多) 。应该按照我怀疑的以下方式计算出最大值:

$max = count($data);

在我的情况下(从我的数据示例示例),这将返回类似4的内容,您的for循环代码将需要引用&#34;&lt;&#34; &#34;&lt; =&#34;。为了优化这一点,我实际上会直接进入for循环&#34; ...; $ x&lt;计数($的数据); ...;&#34;除非您以后需要$ max。

这对我来说是个大问题。我不知道目前你在$ stamp变量和&#34; days&#34;之间有任何相关性。你的sql语句中的列。也许我没有看到你提供足够的信息来完全理解或者我错误地解释你的问题,但你的sql不一定会返回与邮票变量计算相同的日期,而不会肯定会返回一个对于该表中不存在的任何日期,cnt为0。这就是原因:

if ($data[$x]["cnt"] > 0){

该部分的一部分是不必要的,可能不正确。

要回答你的问题,你为何会得到&#34; 2,8,0,0,0,0 ....&#34;而不是你期望的顺序是因为sql没有返回0 cnt值,因为很简单,日期不存在于它的表中,并且当你强行添加时,你的内爆仍然会返回&0 39; 0行后的0&n;后缀:

$expireData[] = 0;

首先,您需要填写数据(或重新编写您的数据以包含正确数组位置的cnt&#39; 0)。您可以使用子查询从sql级别实现此目的,该子查询确保包含缺少的日期,然后强制执行cnt值0。我将这个留给你解决,但另一种方式(通过PHP)是做以下(伪代码):

place each 'stamps' (in unix format) in array from previous loop
forloop $i through $stamps
    array_search $stamps against $data['days']
    if (found)
        $expireDays[] = $data[array_search position]['cnt'];
    else
        $expireDays[] = 0;

这意味着您从第一个循环中删除$ expireDays。

最后,也许我误解了你的“天”。列不应与您的$ stamp日期相匹配,因为这些日期是将来和您的日期&#39;列是过去的。在这种情况下,您唯一的选择是调整您的sql语句强制包含缺少的日期(在特定日期范围之间)

祝你好运。

答案 1 :(得分:1)

为了简化我之前的回答并直接回答您的问题&#34; 如何打印出与时间戳匹配的数据&#34;?

您需要首先将unix时间戳设置为&#34; strtotime(&#39; +&#39;。$ x。&#39; day&#39;,time());&#34;从原始循环到数组。从该循环中删除过期的[]内容。

然后遍历该数组,然后使用array_search查找$ data数组中的任何匹配索引。

if (found in $data array)
    $expireDays[] = $data[array_search position]['cnt'];
else
    $expireDays[] = 0;