Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

GreenTuxer

Ajuda a definir estrutura de dados

Mensagens Recomendadas

GreenTuxer    0
GreenTuxer

Boa tarde!

Preciso de ajuda a definir uma estrutura de dados bastante complexa, em PHP, através de dados obtidos duma BD MySQL, para mostrar no browser.

Efectuo uma query a uma DB que contém vários campos, em que os seguintes são campos que pretendo utilizar para filtrar a informação (os outros são informativos e são a informação que pretendo mostrar no fim):

Ano

Mês

Dia

Hora (são valores pré-definidos, cerca de 8 por dia) - o próprio nome da coluna corresponde às horas que pretendo

Nome do Serviço

Contagem (um número que pretendo obter, para cada hora especificada, para cada serviço)

Exemplos:

[table]

[td]Ano[/td]

[td]Mês[/td]

[td]Dia[/td]

[td]Hora[/td]

[td]Service1[/td]

[td]Service2[/td]

[td]Service3[/td]

[td]Service4[/td]

[td]Service5[/td]

[td]2011[/td]

[td]12[/td]

[td]31[/td]

[td]08:00[/td]

[td]999999[/td]

[td]888888[/td]

[td]777777[/td]

[td]666666[/td]

[td]555555[/td]

[td]2011[/td]

[td]12[/td]

[td]31[/td]

[td]13:00[/td]

[td]999999[/td]

[td]888888[/td]

[td]777777[/td]

[td]666666[/td]

[td]555555[/td]

[td]2011[/td]

[td]12[/td]

[td]31[/td]

[td]16:00[/td]

[td]999999[/td]

[td]888888[/td]

[td]777777[/td]

[td]666666[/td]

[td]555555[/td]

[/table]

Mas isto com centenas de serviços, tendo em conta que as horas e datas são iguais para todos.

Como nem todos os serviços podem correr em todos os dias, pois alguns podem iniciar-se mais tarde (dias, meses, anos), ou façam parte de campanhas que já terminaram, estou a pensar em uma estrutura de dados avançada em PHP, filtrada inicialmente por ano e mês. Mas posso estar errado e por isso é que venho pedir sugestões em casos destes...

foreach year

  foreach month

    foreach day

      foreach hour

        foreach service (e mostrar a contagem do serviço em questão, para a hora em questão.

Isto porque fazendo a query directamente da DB, a estrutura tem que ser desenhada constantemente como sendo tabelas separadas, o que é mau para gerar csv e para organizar todos os dados em uma só tabela...

Claro que com arrays associativas umas dentro de outras fica melhor, mais rápido e mais organizado, mas é aí que reside a minha dúvida no que fazer...

Espero ter-me feito entender. Sei que a pergunta não é fácil, mas posso garantir que não estou a complicar, pois a estrutura não é fácil e não a posso modificar. Eu é que estou a querer mostrar melhor a coisa...

Obrigado pela vossa ajuda.

EDIT:

Ocorreu-me uma estrutura assim:

array('2011' =>

array('12') =>

array('31') =>

array('13h00') =>

array('Service1') =>100000

Será incorrecta ou ineficaz?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1123
HappyHippyHippo

Preciso de ajuda a definir uma estrutura de dados bastante complexa

mas posso garantir que não estou a complicar, pois a estrutura não é fácil e não a posso modificar

.... afinal é para desenhar uma estrutura ou fazer o que com ela ?!?!?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
acao    19
acao

boas

eu pecebo pouco de mysql e php mas se fosse em access fazia duas tabelas:

1. codIdServiço, Nomeserviço

2. codId?, codidServiço,Ano,Mes.Dia

pS: para cada serviço fazia um registo (não estou a ver uma tabela com centenas de campos que funcione bem)

e depois fazia as consultas que intendesse.

cumps

acao

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
taviroquai    61
taviroquai

@GreenTuxer

Só pelo teu logotipo já mereces toda a ajuda  :confused:

Ora bem... as bases de dados servem mesmo para guardar milhares de registo... aqui a questão nem é a estrutura PHP mas sim a forma mais eficiente de devolver dados para o utilizador. Atenção que o utilizador não consegue ver os dados todos de uma vez e é para isso que servem os filtros, pesquisa e paginação; e podes usar o filtro logo no SQL para o php não "sofrer" com tantos dados.

Agora... se precisas mesmo devolver TODOS os registos (isto se forem milhares) e gerar, por exemplo, um csv de uma só vez, então o melhor será criar o script e corre-lo na shell em vez de correr pelo web server. Para isto, talvez outra linguagem seja mais eficiente do que PHP.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
GreenTuxer    0
GreenTuxer

Obrigado taviroquai :)

Talvez não me tenha explicado bem.

O que não posso alterar é a estrutura de dados da base de dados. O que eu quero é processar a query e trabalhar os dados posteriormente, para mostrá-los correctamente e poder gerar csv's com eles.

Já tenho as queries feitas, já obtenho só os dados que pretendo, mas da forma como os obtenho (por serviço, pois é a única forma, pois a ideia é mostrar toda a info dos serviços todos dum país/zona geográfica), é muito limitado para o que pretendo. Daí querer trabalhá-los. Só me falta mesmo essa parte, tudo o resto já tenho feito.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1123
HappyHippyHippo

acho nao vale a pena andares a filtrar por ano ou outra coisa ... deixa ficar tudo no mesmo campo nem que facas "concatenacao" dos dados de data

array("data hora" => array("service 1" => 9999,

                                                "service 2" => 8888),

          "data hora" => array("service 1" => 9999,

                                                "service 2" => 8888));

assim e bem mais facil fazer um filtro de janela temporal

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
taviroquai    61
taviroquai

Hmm... não sei se percebi bem o que indicaste... não vejo nenhuma informação geográfica nos dados que indicaste...

Supondo que recebes os dados da base de dados num array em que cada item é um registo, podes fazer algo deste genero:

$dados = array(
     array('id' => 1, 'ano' => 2011, 'mes' => 12, 'dia' => 20, 'servico1' => 99999, 'servico2' => 88888),
     array('id' => 2, 'ano' => 2011, 'mes' => 12, 'dia' => 20, 'servico1' => 88888, 'servico2' => 77777),
);

function filtrarPorServico($dados, $servico) {
    $result = array();
    foreach($data as $item) {
        $result[] = array('contagem' => $item[$servico], 'ano' => $item['ano', ...);
    }
    return $result;
}

O mesmo podes fazer para organizar por datas... desta forma crias a estrutura que queres na função.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
GreenTuxer    0
GreenTuxer

HappyHippyHippo, era isso mesmo que procurava. Simplifiquei imenso o que tinha (às vezes um gajo gosta mesmo de complicar...) e está quase implementado :)

Tenho andado em testes com isso e a diferença de velocidade e margem de manobra, para o que tinha, são gigantes!

Muito obrigado B)

A parte geográfica é mais complexa do que parece. Está incluída nos nomes dos serviços.

O interface que tenho permite ao utilizador escolher a zona geográfica, depois tenho uma lista de países associados a cada zona e é por aí que faço a filtragem dos serviços que aparecem.

Não é o caso, taviroquai. Existem 7 ou 8 horas por dia, cada uma tem N serviços, cada um com a sua contagem. A forma que o HappyHippyHippo sugeriu parece-me sem dúvida a melhor e mais simples (tão simples que nem pensei nela...)

Abraço a todos B)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade