Varrer matriz multi-dimensional e agrupar resultados

415 views
Skip to first unread message

gusta...@gmail.com

unread,
Mar 23, 2009, 8:27:07 AM3/23/09
to LISTA PHP
Galera, já torrei aqui... vou pedir ajuda aos universitários!

O caso é o seguinte, eu tenho uma função que me retorna um array com
dados de uma consulta sql:


public function ResultaGrade($flt) {
if ($flt == 0) {
$sql = "select g.*, c.nomeCurso, d.nomeDisciplina,
t.nomeTurma from grade g, curso c, turma t, disciplina d where
g.idCurso=c.idCurso and g.idDisciplina=d.idDisciplina and
g.idTurma=t.idTurma order by c.nomeCurso, t.nomeTurma,
d.nomeDisciplina";
$qry = mysql_query($sql,$this->conexao->conectado);
if (mysql_num_rows($qry) > 0) {
while ($res = mysql_fetch_assoc($qry)) {
$arrayGrade[$res['idGrade']] = array($res
['idCurso'], $res['nomeCurso'], array($res['idTurma'] => $res
['nomeTurma'], $res['idDisciplina'] => $res['nomeDisciplina']));
}
} else {
$arrayGrade[][] = "Nenhuma grade curricular
cadastrada";
}
mysql_free_result($qry);
return $arrayGrade;
} else {

}
}

Bem, recebendo esta matriz, terei como exemplo:

Array
(

[3] => Array
(
[0] => 1

[1] => Direito
[2] => Array

(
[1] => I Semestre

[71] => Ciência Política e Teoria do Estado
)


)

[1] => Array

(
[0] => 3
[1] => Sistemas de Informação

[2] => Array
(
[1] => I Semestre

[69] => Fundamentos de Sistemas de Informação
)


)

[2] => Array

(
[0] => 3
[1] => Sistemas de Informação

[2] => Array
(
[1] => I Semestre

[70] => Introdução à Filosofia
)


)

)


Obviamente, quando a tabela estiver populada os cursos vão se repetir
no resultado e é por eles que quero agrupar a listagem, sendo que
preciso ter também o valor de "idGrade" para ter uma ligação mais
rápida depois.
(Ou será que dispensando esse campo e utilizando a combinação dos
outros três "ids" poderia simplificar o caso?...)
Enfim, precisso varrer este array para agrupar seus resultados para
que a listagem final fique assim:


CURSO: XYZ
TURMA: 1
DISCIPLINA: XYZ
DISCIPLINA: ABC
DISCIPLINA: JIOWKERJ
TURMA: 2
DISCIPLINA: UIRUWOERW
DISCIPLINA: KDJFASODF
DISCIPLINA: J87S89DYSJH

CURSO: TRRRT
TURMA: 1
DISCIPLINA: GHTYR
DISCIPLINA: HFFGHRTY
DISCIPLINA: 657YFGHF

Sendo que preciso mesmo inicialmente de todos os dados, por isso que
não filtro no SQL. (Mas falando nisso, será que aquelas condicionais
do MySQL ou alguma função interna dele possa me retornar os resultados
já da maneira que quero?)

Bem pessoal, tentei aqui tudo que sabia, foi na documentação do php e
não achei nada que resolvesse sobre arrays, nem no histórico da lista
e nas buscas do Google (tô me sentindo o primeirão!!! melhor do que
dizer que talvez não tenha sabido procurar ).

Portanto, conto com a ajuda dos cavalheiros e senhoras que me honrarem
ler esta mensagem.

--
Frat.,
Gustavo Adolfo
http://anotacoesdiversas.blogspot.com/

Paulo Diovani

unread,
Mar 24, 2009, 8:46:11 PM3/24/09
to list...@googlegroups.com
Cara, pra postar um código assim, tenta primeiro formatar a consulta
sql de um modo que fica melhor de ler, e não precisa colocar a parte
com mysql_query() e etc.

Agora, para o seu caso, sugiro duas alternativas, cabe a você escolher
dependendo da performance e aplicabilidade.

A primeira seria fazer uma consulta única, como no seu exemplo (mas
prefira usar JOINs no FROM ao invés de fazer eles todos no WHERE, fica
mais legível e, as vezes, mais rápida) e então navegar pelo array
resultado (sim, o php tem uma série de funções para arrays que deve
facilitar a sua vida, http://br.php.net/manual/pt_BR/book.array.php,
mas provavelmente você não vá precisar mais do que alguns foreach)
organizando os cursos, turmas e disciplinas como precisa (é um bom
truque pegar a chave de cada curso e usar como índice nos arrays).

A outra alternativa é separar sua consulta em três, geralmente é o que
faço, a performance pode variar de acordo com a modelagem de dados.
Começa a selecionar a partir das chave estrangeira mais alta (ou
melhor dizendo, a partir da tabela que não tem chave estrangeira), e
depois vá descendo.

Também não custa avisar que não é boa prática usar SELEC * em
produção, selecione apenas aquilo que vai usar pelo nome das colunas
(mesmo que precise de todas elas).

2009/3/23 gusta...@gmail.com <gusta...@gmail.com>:
--
Paulo Diovani
pa...@diovani.com
+55 51 8146 5413
___________________
http://www.diovani.com
Reply all
Reply to author
Forward
0 new messages