Jump to content


Photo

Problema Na Ordenação De Arrays


  • Faça o login para participar
8 replies to this topic

#1 hbm

hbm

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 02/09/2010, 21:35

Olá pessoal, sou novo aqui no fórum e gostaria de pedir uma mão para quem puder me ajudar.

Vou descrever a situação e explicando o que está acontecendo de errado.

No Banco de Dados, tenho os campos "datas" e "horarios" pertencentes a uma tabela...

Os formatos destes campos são:
datas = 23/08/2010;24/08/2010;25/08/2010;(...)
horarios = 13:00:00;15:00:00;17:00:00;19:00:00;(...)

Cada data e cada horário está separado por ";" (ponto e vírgula).

Pois bem, o código deve funcionar da seguinte maneira:

1) O PHP pega a data atual no servidor (variável $data) e o horário de "agora" (variável $horario);

2) Procura no BD os registros que contenham a data atual no campo "datas" (através do LIKE no SELECT);

3) Dentro dos registros encontrados, é necessário pegar o campo "horarios" e dar um explode pelo ";", transformando os horários em arrays;

4) São exibidos na tela somente os horários que sejam MAIORES ou IGUAIS ao horário de "agora" (variável $horario definida no início);

Até aqui tudo ok! O problema vem a seguir:

4) É necessário exibir na tela todos os horários que atendam aos critérios, mas com ordenação crescente.

Já tentei de tudo quando é maneira, todos os tipos de sorts, array_merge, array_combine, array_multisort e outros. Acontece que ele exibe os horários de forma ordenada dentro de cada array gerada, mas não une as arrays para ordenar todos os horários.

Alguma idéia de como fazer isso??? Ficarei extremamente grato por qualquer ajuda. Abraços!


Segue abaixo o código:

<?php

$data = date("d/m/Y");
$hora = date("H:i:s");

$consulta = mysql_query("SELECT datas,horarios FROM tabela WHERE datas LIKE '%$data%'");

while($i = mysql_fetch_array($consulta)) {

$horarios = explode(";", $i[1]);
array_multisort($horarios, SORT_ASC, SORT_REGULAR);

foreach ($horarios as $key => $horarios_each) {
if ($horarios_each >= $hora) {
echo $horarios_each."<br />";
}
}
}

?>

O resultado é o seguinte (precisa ficar ordenado):

22:00:00 | array 1
23:55:00 |
23:56:00 |
23:57:00 |
23:58:00 |
23:59:00 |
--------
23:15:00 | array 2
23:30:00 |
23:45:00 |
23:50:00 |
23:56:00 |
--------
21:30:00 | array 3
23:00:00 |

#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 02/09/2010, 22:01

Se você quer juntar tudo e ordenar, você tem que juntar tudo e ordenar, ora:

$todos = array();

while($i = mysql_fetch_array($consulta)){

$horarios = explode(";", $i[1]);

$todos = array_merge($todos, $horarios);

}

sort($todos);

foreach($todos as $key => $horarios_each) {
if ($horarios_each >= $hora) {
echo $horarios_each."<br />";
}
}

  • hbm likes this

#3 hbm

hbm

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 03/09/2010, 17:17

LeoB, MUITO OBRIGADOOOOOOO!!! Grande abraço!!!

(inseri este post como resposta da minha resposta...hehe mas já editei...)

Poxa, olha só... infelizmente eu não tinha visto tudo o que estava precisando, e apresentei somente uma parte do problema.

A questão é que a $consulta pega outros campos que não são transformadas em arrays. Para cada um dos registros, o SELECT retorna estes campos e mais o campo $horarios. Segue o exemplo da aplicação:

Uma tarefa pode ser realizado em diversos horários. Cada tarefa é um registro no banco de dados e os horários das tarefas são inseridos no campo "horarios" de cada tarefa, conforme apresentado no 1º post (13:00:00;15:00:00;17:00:00;19:00:00;...).

O resultado da consulta deve exibir cada um dos horários, incluindo ao lado a respectiva tarefa, da seguinte forma:

13:00:00 - tarefa1
14:00:00 - tarefa1
15:00:00 - tarefa1
13:00:00 - tarefa2
14:00:00 - tarefa2
15:00:00 - tarefa2
16:00:00 - tarefa2
13:00:00 - tarefa3
14:00:00 - tarefa3

e assim por diante, tendo em vista que a quantidade de horários varia para cada tarefa. Mas além disso preciso exibir de forma ordenada pelos horários e em seguida pelas tarefas, assim:

13:00:00 - tarefa1
13:00:00 - tarefa2
13:00:00 - tarefa3
14:00:00 - tarefa1
14:00:00 - tarefa2
14:00:00 - tarefa3
15:00:00 - tarefa1
15:00:00 - tarefa2
16:00:00 - tarefa2

Acredito que isso não exija uma modificação muito grande, mas poxa não estou conseguindo unir os dados definindo cada tarefa como uma chave, nem o horário.

Edição feita por: hbm, 03/09/2010, 17:16.


#4 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 03/09/2010, 19:10

Se é só mostrar a tarefa do lado, separando com um hífen, vamos usar POG, pra não complicar demais o código.

$todos = array();

while($i = mysql_fetch_array($consulta)){

$horarios = explode(";", $i[1]);

$c = count($horarios);

for($j=0;$j<$c;$j++){
$horarios[$j] .= ' - ' . $i[2]; // índice da tarefa aqui
}

$todos = array_merge($todos, $horarios);

}

sort($todos);

Se isso não for o suficiente, aí a gente pensa num código mais direito.
  • hbm likes this

#5 hbm

hbm

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 03/09/2010, 20:31

LeoB, muito obrigado mais uma vez!!!

Acontece que agora não estou conseguindo utilizar cada variável separadamente.

A linha abaixo me permite colocar as variáveis juntas, mas se eu quiser criar uma tabela, colocando cada variável em uma célula, não consigo. O "foreach" me permite imprimir somente a linha inteira, com as duas variáveis, sem separá-las...

$horarios[$j] .= ' - ' . $i[2]; // índice da tarefa aqui

#6 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 03/09/2010, 21:00

Então é o caso de complicar mesmo.

$todos = array();

while($i = mysql_fetch_array($consulta)){

$horarios = explode(";", $i[1]);

$c = count($horarios);

for($j=0;$j<$c;$j++){
$todos[] = array($horarios[$j], $i[2]);
}

}

function comparar($a, $B){
return strcasecmp($a[0], $b[0]);
}

usort($todos, 'comparar');

Até que não ficou ruim. Não sei se é a melhor solução, mas é o que consegui fazer aqui rapidinho.
  • hbm likes this

#7 hbm

hbm

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 03/09/2010, 21:49

Poxa, obrigado, mas este último código não entendi direito... :(
Está dando erro pois as variáveis "a" e "B" não estão definidas.


Olha só, em uma versão bem anterior eu estava conseguindo manipular cada variável separadamente, faltando só conseguir ordenar os arrays (ou seja, fazer uma exibição ordenada na tela, pois os horários dentro do array já ficam ordenados pelo "sort").

	<?php

$data = date("d/m/Y");
$hora = date("H:i:s");

$consulta = mysql_query("SELECT id,tarefa,datas,horarios FROM tabela WHERE datas LIKE '%$data%'");

while ($i = mysql_fetch_array($consulta)) {

$id = $i[0];
$tarefa = $i[1];
$horarios = explode(";", $i[3]);

sort($horarios);

foreach($horarios as $key => $value) {

$tarefas = array("$value","$tarefa");

if ($tarefas[0] >= $hora) {

echo "Horário: ".$tarefas[0]." - Tarefa: ".$tarefas[1];

}

}

}

?>


#8 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 03/09/2010, 22:00

Ué... Eu tinha editado o código. É "a" e "b", em minúsculo. Alguma coisa aqui no fórum está forçando deixar em maiúsculo. Mudei pra x e y. Acrescentei também a parte de imprimir, pra você ver como manipular os dados.

$todos = array();

while($i = mysql_fetch_array($consulta)){

$horarios = explode(";", $i[1]);

$c = count($horarios);

for($j=0;$j<$c;$j++){
$todos[] = array($horarios[$j], $i[2]);
}

}

function comparar($x, $y){
return strcasecmp($x[0], $y[0]);
}

usort($todos, 'comparar');

foreach($todos as $Registro){
echo $Registro[0] . ' - ' . $Registro[1] . '<br>';
}

Perceba que agora temos um array bidimensional, ou um array de arrays.

E leia a documentação para as funções usort e strcasecmp.
  • hbm likes this

#9 hbm

hbm

    Novato no fórum

  • Usuários
  • 11 posts
  • Sexo:Masculino
  • Localidade:Porto Alegre

Posted 03/09/2010, 22:48

LeoB, deixa eu te dizer o seguinte: muitíssimo obrigado!! Está funcionando perfeitamente.

Eu estava tentando fazer isto desde terça-feira... pode?? rsrsrs

Você me salvou. Grande abraço! Live long and prosper!




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq