Adicionar datas faltantes a uma matriz

Eu tenho a seguinte matriz:

Array ( [2010-10-30] => 1 [2010-11-11] => 1 [2010-11-13] => 11 ) 

Estou tentando preencher a matriz com todas as datas que faltam entre o primeiro e o último elemento. Eu estava tentando usar o seguinte, mas não consegui em lugar algum:

 foreach($users_by_date as $key => $value){ $real_next_day = date($key, time()+86400); $array_next_day = key(next($users_by_date)); if($real_next_day != $array_next_day){ $users_by_date[$real_next_day] = $value; } } 

As classs DateTime, DateInterval e DatePeriod podem realmente ajudar aqui.

 $begin=date_create('2010-10-30'); $end=date_create('2010-11-13'); $i = new DateInterval('P1D'); $period=new DatePeriod($begin,$i,$end); foreach ($period as $d){ $day=$d->format('Ym-d'); $usercount= isset($users_by_date[$day]) ? $users_by_date[$day] :0; echo "$day $usercount"; } 

Estive esperando uma chance de experimentar os objects DateTime e DateInterval no PHP 5.3, sua pergunta foi a oportunidade perfeita para fazer exatamente isso. Observe que este código não funcionará com versões PHP anteriores a 5.3

  1, '2010-11-01' => 1, '2010-11-13' => 1); // get start and end out of array reset($dates); $start = new DateTime(key($dates)); end($dates); $end = new DateTime(key($dates)); foreach (new DatePeriod($start, new DateInterval('P1D'), $end) as $date) { $dateKey = $date->format('Ym-d'); // get properly formatted date out of DateTime object if (!isset($dates[$dateKey])) { $dates[$dateKey] = 1; } } print_r($dates); 

As funções que você está procurando (mas não usando em seu exemplo) são strtotime & diff

Você conseguiria o intervalo do dia entre suas duas datas $numdiff e simplesmente faria algo em um loop que faria:

 for ($i=1; $i<=$numdiff; $i++) { echo date("Ymd", strtotime("2010-10-30 +".$i." day")); } 

O resultado deve ser algo como:

 2010-10-31 2010-11-01 2010-11-02... 

Você poderia então aparecer isso na sua matriz conforme necessário. Espero que você comece na direção certa.

Para índices usando timestamps, você pode gerar sua matriz facilmente usando a function de alcance.

 $startStamp = ... $endStamp = ... $oneDay = 60*60*24; $timeIndexes = range($startStamp, $endStamp, $oneDay); $filler = array_fill(0, count($timeIndexes), null); $timeArray = array_combine($timeIndexes, $filler); 

Não tenho certeza dos valores que deseja na matriz, mas espero que seja relativamente direto daqui.

Se você estiver convertendo cada timestamp em uma seqüência de data formatada de qualquer maneira e preferiria usar as strings de data em primeiro lugar, considere essa modificação.

 $dateStringIndexes = array_map( function ($t) { return date('Ym-d', $t); }, $timeIndexes ); 

Claro, uma vez que você está no PHP 5.2, você provavelmente terá que se comprometer com um loop foreach em vez do encerramento.

Esta é a function compatível com PHP 5.2 que eu criei com isso funciona.

Obrigado rapazes

 reset($users_by_date); $date = key($users_by_date); end($users_by_date); $end = key($users_by_date); while(strtotime($date) <= strtotime($end)){ $datearray[] = date("Ymd", strtotime($date)); $date = date("Ymd", strtotime("+1 day", strtotime($date))); } foreach($datearray as $key => $value){ if(!isset($users_by_date[$value])){ $users_by_date[$value] = 0; } } ksort($users_by_date);