Ir para conteúdo
Fórum Script Brasil
  • 0

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


JCF

Pergunta

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

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...