• 0
Sign in to follow this  
JCF

Saber se um intervalo de datas pertence a um conjunto de intervalo de

Question

Boa noite.

Tenho um problema complexo (pelo menos para mim) e acho que tem mais a ver com o algoritmo do que com o código.

Quero fazer o seguinte:

-Tenho uma tabela onde guardo a data de início e data de fim de um evento. Quero fazer uma função que faça o seguinte: dado um intervalo de datas (data de início e data de fim), percorre todos os eventos e devolve um array com todas as datas sem eventos. Note-se que podem existir eventos sobrepostos, ou seja, eventos que coincidem num determinado período como mostro no exemplo abaixo.

Exemplo:

Datas na tabela:

Inicio: 2012-02-21 - Fim: 2012-02-26

Inicio: 2012-01-23 - Fim: 2012-01-31

Inicio: 2012-02-15 - Fim: 2012-02-23

Período pretendido (passado como parâmetro na função): Início: 2012-01-22 - Fim: 2012-02-28

O resultado seria:

Início: 2012-01-22 - Fim: 2012-01-22

Início: 2012-02-01 - Fim: 2012-02-14

Início: 2012-02-27 - Fim: 2012-02-28

Espero que tenha dado para perceber.

JCF

Share this post


Link to post
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Desenvolvi um código que você precisa:

<?php
// Junta todos os dias com evento em uma array (não tem problema se repetir datas)
$com_evento = diasintervalo('2012-02-21', '2012-02-26');
$com_evento = array_merge($com_evento, diasintervalo('2012-01-23', '2012-01-31'));
$com_evento = array_merge($com_evento, diasintervalo('2012-02-15', '2012-02-23'));

// Intervalo de busca
$pretendido = diasintervalo('2012-01-22', '2012-02-28');

// Verifica quais os dias que estão na array $pretendido e 
// que não estão na array $com_evento, resultando uma terceira array ($livre)
$livre = array_diff($pretendido, $com_evento);
var_dump($livre);


// Função que retorna um array com todos os dias desde o $inicio até o $fim
function diasintervalo ($inicio, $fim) {
    $final = $inicio;    
    while ($final <= $fim) {
        $resultado[] = $final;
        list ($anoi, $mesi, $diai) = explode('-', $final);
        $final = date('Y-m-d', mktime (0, 0, 0, $mesi , $diai+1, $anoi));  
    }
    return $resultado;
}
?>

Vai resultar:

array

0 => string '2012-01-22' (length=10)

10 => string '2012-02-01' (length=10)

11 => string '2012-02-02' (length=10)

12 => string '2012-02-03' (length=10)

13 => string '2012-02-04' (length=10)

14 => string '2012-02-05' (length=10)

15 => string '2012-02-06' (length=10)

16 => string '2012-02-07' (length=10)

17 => string '2012-02-08' (length=10)

18 => string '2012-02-09' (length=10)

19 => string '2012-02-10' (length=10)

20 => string '2012-02-11' (length=10)

21 => string '2012-02-12' (length=10)

22 => string '2012-02-13' (length=10)

23 => string '2012-02-14' (length=10)

36 => string '2012-02-27' (length=10)

37 => string '2012-02-28' (length=10)

Modifique para adequar às suas necessidades

Share this post


Link to post
Share on other sites
  • 0
Desenvolvi um código que você precisa:

<?php
// Junta todos os dias com evento em uma array (não tem problema se repetir datas)
$com_evento = diasintervalo('2012-02-21', '2012-02-26');
$com_evento = array_merge($com_evento, diasintervalo('2012-01-23', '2012-01-31'));
$com_evento = array_merge($com_evento, diasintervalo('2012-02-15', '2012-02-23'));

// Intervalo de busca
$pretendido = diasintervalo('2012-01-22', '2012-02-28');

// Verifica quais os dias que estão na array $pretendido e 
// que não estão na array $com_evento, resultando uma terceira array ($livre)
$livre = array_diff($pretendido, $com_evento);
var_dump($livre);


// Função que retorna um array com todos os dias desde o $inicio até o $fim
function diasintervalo ($inicio, $fim) {
    $final = $inicio;    
    while ($final <= $fim) {
        $resultado[] = $final;
        list ($anoi, $mesi, $diai) = explode('-', $final);
        $final = date('Y-m-d', mktime (0, 0, 0, $mesi , $diai+1, $anoi));  
    }
    return $resultado;
}
?>

Vai resultar:

array

0 => string '2012-01-22' (length=10)

10 => string '2012-02-01' (length=10)

11 => string '2012-02-02' (length=10)

12 => string '2012-02-03' (length=10)

13 => string '2012-02-04' (length=10)

14 => string '2012-02-05' (length=10)

15 => string '2012-02-06' (length=10)

16 => string '2012-02-07' (length=10)

17 => string '2012-02-08' (length=10)

18 => string '2012-02-09' (length=10)

19 => string '2012-02-10' (length=10)

20 => string '2012-02-11' (length=10)

21 => string '2012-02-12' (length=10)

22 => string '2012-02-13' (length=10)

23 => string '2012-02-14' (length=10)

36 => string '2012-02-27' (length=10)

37 => string '2012-02-28' (length=10)

Modifique para adequar às suas necessidades

Valeu. Adequa perfeitamente àquilo que eu pretendo.

Muito obrigado.

JCF

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this