填补多维数组中的空白

时间:2011-01-09 15:30:49

标签: php sql mysql

我有一个来自这个mysql查询的数组:

SELECT COUNT(*) as opens, HOUR(FROM_UNIXTIME(open_date)) as hour 
FROM tracking WHERE open_id = 10 GROUP BY HOUR(FROM_UNIXTIME(open_date)) 

它允许我每小时打开一次。然而,由于在特定时刻没有打开任何时间,因此在小时数方面存在一些差距。如何填补空白,即转动这个数组:

Array ( 
[0] => Array ( [opens] => 9 [hour] => 0 ) 
[1] => Array ( [opens] => 2 [hour] => 3 ) )

分为:

Array ( 
[0] => Array ( [opens] => 9 [hour] => 0 ) 
[1] => Array ( [opens] => 0 [hour] => 1 ) 
[2] => Array ( [opens] => 0 [hour] => 2 ) 
[3] => Array ( [opens] => 2 [hour] => 3 ) )

换句话说,在0开启的情况下填补缺失的小时数?我可以更改我的SQL查询以使其工作,还是必须通过PHP?

感谢大家的帮助。

4 个答案:

答案 0 :(得分:4)

$aHours = array();

foreach (range(0,23) as $nHour){

    $aHours[] = array('opens' => 0, 'hour' => $nHour);

}

// your query goes here with result into $aMyQueryResult

foreach ($aMyQueryResult as $aOpensHour){

  $aHours[$aOpensHour['hour']] = $aOpensHour;

}

答案 1 :(得分:2)

您可以根据您获得的结果在代码中执行此操作。仅使用数据库的一种方法是使用包含小时数的表(可能甚至是临时表)并在hourstracking之间执行左外连接。请注意,这是实用的,因为hours的范围是固定的并且相对较小 - 基本上是包含数字0-23的单个列。

SELECT COUNT(*) as opens, hours.hour
FROM hours
LEFT OUTER JOIN tracking ON hours.hour = HOUR(FROM_UNIXTIME(tracking.open_date))
WHERE tracking.open_id = 10
GROUP BY hours.hour

答案 2 :(得分:1)

从头到尾,有这样的事情:

$newArray = new array();
$count = 0;
foreach ($yourArray as $opensHour){
  $thiscount = $opensHour['hour'];
  while($thiscount>$count){
     $newArray[] = array("opens"=>0, "hour"=>$count);
     $count++
  }
  $newArray[] = $opensHour;
  $count++; 
}

答案 3 :(得分:1)

$newArray = array();
$count = 0;
foreach ($resultFromDB as $opensHour){
  $thiscount = $opensHour['hour'];
  while($thiscount>$count){
     $newArray[] = array("opens"=>0, "hour"=>$count);
     $count++;
  }
  $newArray[] = $opensHour;
  $count++; 
}
while ($count < 24) {
    $newArray[] = array("opens"=>0, "hour"=>$count);
     $count++;
}

改编自@ Nanne的解决方案,以填补最多23小时的缺失时间。

相关问题