2012-04-29 2 views
0
function convertDates($timestamp) { 
    return date('Y-m-d', $timestamp); 
} 
$days = array(); //storing databases php time(); 
$complete = array(); //storing the generated missing days 
$occurrences = array(); //finding how many php time() are on same day 
$zero = array(); //instead of storing occurrence as 1, store it as zero 
$query = mysql_query("SELECT `login` FROM `statistics` ORDER BY `login` ASC"); 
while($rows = mysql_fetch_array($query)) { 
    $days[] = $rows['login']; //filling array with times 
} 
$days[] = time(); //append current time 
for($i = 0; $i < count($days); $i++) { 
    $complete[] = convertDates($days[$i]); 
    $difference = isset($days[$i+1]) ? $days[$i+1] - $days[$i] : 0; 
    if($difference >= 86400) { 
     $difference = ceil(abs($difference/86400)); 
     $fill = $days[$i]; 
     for($k = 0; $k < $difference; $k++) { 
      $fill += 86400; 
      $complete[] = convertDates($fill); 
      $zero[] = convertDates($fill); 
     } 
    } 
} 
$occurrences = array_count_values($complete); 
$complete = array_unique($complete); 
$zero = array_unique($zero); 
sort($complete); 
echo "["; 

for($i = 0; $i < count($zero); $i++) { 
    echo "[\"".$zero[$i]."\",0], "; 
} 

for($i = 0; $i < count($occurrences); $i++) { 
    if($i == count($occurrences)-1) 
     echo "[\"".$complete[$i]."\",".$occurrences[$complete[$i]]."]"; 
    else { 
     echo "[\"".$complete[$i]."\",".$occurrences[$complete[$i]]."], "; 
    } 
} 
echo "]"; 

Я рисую точки в графе jqplot и для статистики, мне нужно определить дни, когда пользователь не заходил. Давайте назову эти «пробелы»Заполнение отсутствующих дней в массиве

Пользователь регистрируется 25 марта 2012 года и не заходит в течение 5 дней. Сейчас 30 марта 2012 года. Я должен создать те недостающие дни из двух дат.

Мой текущий алгоритм, похоже, не работает. Я не могу понять, что происходит не так.

Даты в базе данных, из PHP time();

Я хранящийся все значения в массив $days

Вот выход из таблицы логинов генерируемого скрипта. Обратите внимание, что он закодирован для jqplot:

[["2012-04-01",0], ["2012-04-02",0], ["2012-04-03",0], ["2012-04-04",0], ["2012-04-05",0], ["2012-04-07",0], ["2012-04-08",0], ["2012-04-09",0], ["2012-04-10",0], ["2012-04-11",0], ["2012-04-12",0], ["2012-04-13",0], ["2012-04-14",0], ["2012-04-15",0], ["2012-04-16",0], ["2012-04-17",0], ["2012-04-18",0], ["2012-04-19",0], ["2012-04-20",0], ["2012-04-21",0], ["2012-04-22",0], ["2012-04-23",0], ["2012-04-24",0], ["2012-04-25",0], ["2012-04-26",0], ["2012-04-27",0], ["2012-04-28",0], ["2012-04-29",0], ["2012-04-30",0], ["2012-03-31",1], ["2012-04-01",2], ["2012-04-02",2], ["2012-04-03",1], ["2012-04-04",19], ["2012-04-05",13], ["2012-04-06",8], ["2012-04-07",1], ["2012-04-08",1], ["2012-04-09",4], ["2012-04-10",1], ["2012-04-11",1], ["2012-04-12",2], ["2012-04-13",1], ["2012-04-14",1], ["2012-04-15",1], ["2012-04-16",2], ["2012-04-17",10], ["2012-04-18",1], ["2012-04-19",1], ["2012-04-20",1], ["2012-04-21",1], ["2012-04-22",1], ["2012-04-23",1], ["2012-04-24",1], ["2012-04-25",1], ["2012-04-26",1], ["2012-04-27",1], ["2012-04-28",1], ["2012-04-29",1], ["2012-04-30",2]] 

Мой скрипт не работает. Как я могу правильно генерировать дни, когда пользователь не заходил в систему?

Спасибо за ваше время.

+1

Вы показали нам «вывод из таблицы логинов, сгенерированной скриптом». Это выглядит хорошо для меня, потому что все даты присутствуют, а некоторые показывают нулевые логины. Есть ли проблема с выходом? – Smandoli

ответ

1

Используйте цикл, чтобы пройти через последовательные даты, с использованием функции как:

$date = strtotime(date("Y-m-d", strtotime($date)) . " +1 day"); 

Для каждого цикла, применить результат запроса. Тогда у вас будут все даты. Вы все равно будете использовать цикл; но основой будет продолжение дня, а не результат запроса.

Псевдо-код:

for ($day_counter = 0; $day_counter < 365; $day_counter++) { 

    $day_this = strtotime(date("Y-m-d", strtotime($day_this)) . " +1 day"); 
    $login_count = mysql_query("SELECT COUNT(DATE(login)) AS date_login 
       FROM statistics 
       WHERE date_login=".$day_this); 

    array_push($days, array($day_this=>$login_count); 

} 

Не знаете, как эта часть должна выглядеть:

COUNT(DATE(login)) 

... но идея состоит в том, что вы преобразовать значение даты и времени, чтобы просто даты, затем введите счетчик.

CORRECTION:

COUNT (ДАТА (Войти)) неправильно. Вы должны применить функцию COUNT() к отдельному полю записи (обычно это первичный ключ) и использовать функцию, которая сворачивает дату/время в простую дату в предложении WHERE. Я часто начинаю с того, что я написал выше, а затем выяснил это. :-)

+0

Прошу прощения, я немного смущен. Должен ли я использовать текущий массив у меня с '$ difference = isset ($ days [$ i + 1])? $ days [$ i + 1] - $ days [$ i]: 0; 'затем сравните это с вашей' $ date' и посмотрите, больше ли это? – Kyle

+0

Ничего себе, я бы хотел подумать об этом раньше. Я ненавижу делать вещи более сложными, чем они должны быть. Спасибо, Скандоли. ^. ^ – Kyle

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