2011-01-09 4 views
2

У меня есть массив из этого MySQL Query:заполнить пробелы в многомерный массив

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)) 

Into:

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?

Спасибо всем за любую помощь.

ответ

2

Вы можете сделать это в коде на основе результатов, которые вы получите обратно. Один из способов сделать это, используя только базу данных, - это иметь таблицу (возможно, даже временную), которая содержит часы, и сделать левое внешнее соединение на hours против tracking. Обратите внимание, что это практично только потому, что диапазон для 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 
+0

Через некоторое время я понял, что это своего рода решение, мне нужно! Благодарю. – Abs

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++; 
} 
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; 

} 
+0

Простой, большое спасибо! Ответ каждого другого будет работать так +1 для всех. – Abs

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.

Смежные вопросы