lha2 Posted November 9, 2011 Report Share Posted November 9, 2011 Olá novamente, estou desenvolvendo uma aplicação de reservas com calendário de disponibilidade, estou com uma dúvida num FOR, segue o código...:// Variáveis $ano = date("Y"); $cont = 0; $dia = date("d"); $dias = array(); $mes = date("m"); $totalDias = date("t"); $primeiroDia = date("D", mktime(0, 0, 0, $mes, 1, $ano)); $diaprimeiro = "01"; $diafinal = UltimoDia($ano,$mes); $data_inicio = $ano."-".$mes."-".$diaprimeiro; $data_fim = $ano."-".$mes."-".$diafinal; $dias_reservas = array(); // Fim Variáveis for($d = 0; $d < $totalDias; $d++)$dias[$d] = array_push($dias, $d+1); $sql1 = mysql_query("SELECT * FROM reservas WHERE data_inicio BETWEEN '$data_inicio' AND '$data_fim' AND id_imovel = '$imovel'"); while($reserva = mysql_fetch_array($sql1, MYSQL_ASSOC)) { //defino data 1 $datas1 = explode("-",$reserva[data_inicio]); $ano1 = $datas1[0]; $mes1 = $datas1[1]; $dia1 = $datas1[2]; echo $datas1[0]."<br>".$datas1[1]."<br>".$datas1[2]."<br>"; //defino data 2 $datas2 = explode("-",$reserva[data_fim]); $ano2 = $datas2[0]; $mes2 = $datas2[1]; $dia2 = $datas2[2]; echo $datas2[0]."<br>".$datas2[1]."<br>".$datas2[2]."<br>"; //calculo timestamp das duas datas $timestamp1 = mktime(0,0,0,$mes1,$dia1,$ano1); $timestamp2 = mktime(0,0,0,$mes2,$dia2,$ano2); //diminuo a uma data a outra $segundos_diferenca = $timestamp1 - $timestamp2; //converto segundos em dias $dias_diferenca = $segundos_diferenca / (60 * 60 * 24); //obtenho o valor absoluto dos dias (tiro o possível sinal negativo) $dias_diferenca = abs($dias_diferenca); //tiro os decimais aos dias de diferenca $dias_diferenca = floor($dias_diferenca); echo $dias_diferenca."<br>"; //O RESULTADO DESTE FOR É DUVIDOSO... RSRSRS SOBRE ELE ESTOU COM DÚVIDA for($t = 0; $t <= $dias_diferenca; $t++) { $dias_reservas[$t] = array_push($dias_reservas, $dia1+$t); } }O resultado do for acima é:Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 4 [4] => 9 [5] => 10 [6] => 12 [7] => 13 [8] => 14 )Está desordenado e com datas que não estão no banco, alguém poderia me ajudar? Quote Link to comment Share on other sites More sharing options...
0 mJi Posted November 10, 2011 Report Share Posted November 10, 2011 Este resultado, é o conteúdo do array $dias_reservas?O array_push retorna o tamanho do array após a inserção nos novos valores... Então é normal que a cada loop, ele retorne o que havia retornado no loop anterior mais um. Quote Link to comment Share on other sites More sharing options...
0 MTavares Posted November 10, 2011 Report Share Posted November 10, 2011 (edited) tente começar do 1. Assim:for($d = 1; $d < $totalDias; $d++)$dias[$d] = array_push($dias, $d+1);Desculpe... estou no trabalho e li rapidamente o seu post... desconsidere o meu comentário. Edited November 10, 2011 by MTavares Quote Link to comment Share on other sites More sharing options...
0 lha2 Posted November 10, 2011 Author Report Share Posted November 10, 2011 Bom, eu expliquei e defini mal o que queria perguntar, o código em dúvida é este:for($t = 0; $t <= $dias_diferenca; $t++) { $dias_reservas[$t] = array_push($dias_reservas, $dia1+$t); }Ele está dentro do while que retorna todas as reservas listadas dentro de um período, então, a cada reserva encontrada ele verifica o período da reserva e lança os dias individualmente no array $dias_reservas, só que o resultado sai desordenado... conforme mostrei acima... Populei uma base de testes com datas de reservas fictícias para fazer o teste e sai tudo errado. Quote Link to comment Share on other sites More sharing options...
0 Willian Gustavo Veiga Posted November 10, 2011 Report Share Posted November 10, 2011 Li rapidamente seu post. Pesquise sobre ORDER BY.Um abraço. Quote Link to comment Share on other sites More sharing options...
0 mJi Posted November 11, 2011 Report Share Posted November 11, 2011 Bom, eu expliquei e defini mal o que queria perguntar, o código em dúvida é este:for($t = 0; $t <= $dias_diferenca; $t++) { $dias_reservas[$t] = array_push($dias_reservas, $dia1+$t); } Ele está dentro do while que retorna todas as reservas listadas dentro de um período, então, a cada reserva encontrada ele verifica o período da reserva e lança os dias individualmente no array $dias_reservas, só que o resultado sai desordenado... conforme mostrei acima... Populei uma base de testes com datas de reservas fictícias para fazer o teste e sai tudo errado. Como eu já disse... você está atribuindo o retorno de array_push ao seu vetor. Não seria melhor inserir com $dias_reservas[] = $dia1+$t;?usar o array_push pra unserir um único elemento no final do array é completamente desnecessário. Quote Link to comment Share on other sites More sharing options...
0 lha2 Posted November 12, 2011 Author Report Share Posted November 12, 2011 Amigo, obrigado, com esse:$dias_reservas[] = $dia1+$t; Deu certinho, porém o que ocorre agora? É que o primeiro elemento do array $dias_reservas não é encontrado: echo "<table align='center' border=1 cellspacing=0 cellpadding=0>"; echo "<tr><td bgColor='cyan' colspan=7><center><b>$mes2/$ano</b></center></td></tr>"; echo "<tr><td>Domingo</td><td>Segunda</td><td>Terça</td><td>Quarta</td><td>Quinta</td><td>Sexta</td><td>Sábado</td></tr>"; for($linha = 0; $linha < 6; $linha++){ echo "<tr>"; for($coluna = 0; $coluna < 7; $coluna++){ $pos2 = $cont - $pos; if(empty($dias[$pos2]))echo "<td><center>-</center></td>"; else{ $busca_data = array_search($dias[$pos2],$dias_reservas); if ($busca_data) { echo "<td bgColor='darkgray'><b><center><font color='blue'>".$dias[$pos2]."</font></center></b></td>"; } else { echo "<td><center>".$dias[$pos2]."</center></td>"; } }//Fim do else $cont++; }//Fim do for echo "</tr>"; }//Fim do forEntão ele monta o calendário com o primeiro dia de reservas sem marcar a data.Há algo que posso fazer? Quote Link to comment Share on other sites More sharing options...
0 mJi Posted November 12, 2011 Report Share Posted November 12, 2011 $busca_data = array_search($dias[$pos2],$dias_reservas); if ($busca_data) { echo "<td bgColor='darkgray'><b><center><font color='blue'>".$dias[$pos2]."</font></center></b></td>"; } else { echo "<td><center>".$dias[$pos2]."</center></td>"; }Não é uma boa ideia pegar o retorno de 'array_search()' e colocar no 'if' sem fazer a comparação. Array_search pode retorna FALSE se não encontra nenhum valor no array, mas também pode retornar a posição zero do array, que é interpretado como um FALSE pelo if, embora não seja. Lembre-se que zero é interpretado como FALSE, e qualquer valor não-zero é interpretado como TRUE.Veja na documentação:This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE, such as 0 or "". Please read the section on Booleans for more information. Use the === operator for testing the return value of this function.Ou seja, pesquise sobre o operador === ou ==!. Quote Link to comment Share on other sites More sharing options...
0 lha2 Posted November 13, 2011 Author Report Share Posted November 13, 2011 Amigão, como poderia fazer isso? Quote Link to comment Share on other sites More sharing options...
0 mJi Posted November 13, 2011 Report Share Posted November 13, 2011 Amigão, como poderia fazer isso?Já falei, procure informações sobre o operador === (ou !==) Quote Link to comment Share on other sites More sharing options...
0 lha2 Posted November 15, 2011 Author Report Share Posted November 15, 2011 Amigo, procurei e tentei tudo o que pude, até colocar foreach, porém fez loop e detonou o formato do calendário.Me dá mais uma luz aí...Consegui!!!!!!!!!! Valeu amigão, fiz uma última tentativa e consegui! Valeu mesmo... Quote Link to comment Share on other sites More sharing options...
0 lha2 Posted November 21, 2011 Author Report Share Posted November 21, 2011 Amigão, vou te perturbar de novo...Olha só, pra montar o calendário, marcar os dias indisponíveis, faço uma consulta SQL, só que fiz uns testes e resultou num probleminha... segue o código.<? if ($dados[tipo] == "Locação Temporária") { ?> <tr> <td style="border-bottom: 1 solid #000000"> <p class="subtitulo">Disponibilidade do imóvel</td> </tr> <tr> <td> <? //Funções function UltimoDia($ano,$mes){ if (((fmod($ano,4)==0) and (fmod($ano,100)!=0)) or (fmod($ano,400)==0)) { $dias_fevereiro = 29; } else { $dias_fevereiro = 28; } switch($mes) { case 01: return 31; break; case 02: return $dias_fevereiro; break; case 03: return 31; break; case 04: return 30; break; case 05: return 31; break; case 06: return 30; break; case 07: return 31; break; case 08: return 31; break; case 09: return 30; break; case 10: return 31; break; case 11: return 30; break; case 12: return 31; break; } } // Fim funções // Variáveis if (!isset($ano_form)) { $ano = date("Y"); $totalDias = UltimoDia($ano,$mes); } else { $ano = $ano_form; $totalDias = UltimoDia($ano,$mes_form); } $cont = 0; $dia = date("d"); $dias = array(); if (!isset($mes_form)) { $mes = date("m"); $totalDias = UltimoDia($ano,$mes); } else { $mes = $mes_form; $totalDias = UltimoDia($ano_form,$mes); } $primeiroDia = date("D", mktime(0, 0, 0, $mes, 1, $ano)); $diaprimeiro = "01"; $diafinal = UltimoDia($ano,$mes); $data_inicio = $ano."-".$mes."-".$diaprimeiro; $data_fim = $ano."-".$mes."-".$diafinal; $dias_reservas = array(); // Fim Variáveis for($d = 0; $d < $totalDias; $d++)$dias[$d] = array_push($dias, $d+1); $sql1 = mysql_query("SELECT * FROM reservas WHERE data_inicio BETWEEN '$data_inicio' AND '$data_fim' AND id_imovel = '$imovel'"); while($reserva = mysql_fetch_array($sql1, MYSQL_ASSOC)) { //defino data 1 $datas1 = explode("-",$reserva[data_inicio]); $ano1 = $datas1[0]; $mes1 = $datas1[1]; $dia1 = $datas1[2]; //defino data 2 $datas2 = explode("-",$reserva[data_fim]); $ano2 = $datas2[0]; $mes2 = $datas2[1]; $dia2 = $datas2[2]; //calculo timestamp das duas datas $timestamp1 = mktime(0,0,0,$mes1,$dia1,$ano1); $timestamp2 = mktime(0,0,0,$mes2,$dia2,$ano2); //diminuo a uma data a outra $segundos_diferenca = $timestamp1 - $timestamp2; //converto segundos em dias $dias_diferenca = $segundos_diferenca / (60 * 60 * 24); //obtenho o valor absoluto dos dias (tiro o possível sinal negativo) $dias_diferenca = abs($dias_diferenca); //tiro os decimais aos dias de diferenca $dias_diferenca = floor($dias_diferenca); for($t = 0; $t <= $dias_diferenca; $t++) { $dias_reservas[] = $dia1+$t; } } switch($primeiroDia){ case "Sun": $pos = 0; break; case "Mon": $pos = 1; break; case "Tue": $pos = 2; break; case "Wed": $pos = 3; break; case "Thu": $pos = 4; break; case "Fri": $pos = 5; break; case "Sat": $pos = 6; break; }//Fim do switch switch($mes){ case 1: $mes2 = "Janeiro"; break; case 2: $mes2 = "Fevereiro"; break; case 3: $mes2 = "Março"; break; case 4: $mes2 = "Abril"; break; case 5: $mes2 = "Maio"; break; case 6: $mes2 = "Junho"; break; case 7: $mes2 = "Julho"; break; case 8: $mes2 = "Agosto"; break; case 9: $mes2 = "Setembro"; break; case 10: $mes2 = "Outubro"; break; case 11: $mes2 = "Novembro"; break; case 12: $mes2 = "Dezembro"; break; }//Fim do switch //Função para buscar dentro do array function array_search_i($str,$array){ foreach($array as $key => $value) { if(stristr($str,$value)) return $key; } return false; } if ($mes == "12") { $ano_avanca = $ano + 1; $mes_avanca = "01"; $ano_retrocede = $ano; $mes_retrocede = $mes - 1; } elseif ($mes == "01") { $ano_avanca = $ano; $mes_avanca = $mes + 1; $ano_retrocede = $ano - 1; $mes_retrocede = "12"; } else { $ano_avanca = $ano; $mes_avanca = $mes + 1; $ano_retrocede = $ano; $mes_retrocede = $mes - 1; } echo "<table align='center' border=1 cellspacing=0 cellpadding=0>"; echo "<tr><td bgColor='cyan' colspan=7><center><small><a href='?imovel=".$imovel."&mes_form=".$mes_retrocede."&ano_form=".$ano_retrocede."'>Retroceder</a> -</small> <b>$mes2/$ano</b> <small>- <a href='?imovel=".$imovel."&mes_form=".$mes_avanca."&ano_form=".$ano_avanca."'>Avançar</a></small></center></td></tr>"; echo "<tr><td>Domingo</td><td>Segunda</td><td>Terça</td><td>Quarta</td><td>Quinta</td><td>Sexta</td><td>Sábado</td></tr>"; for($linha = 0; $linha < 6; $linha++){ echo "<tr>"; for($coluna = 0; $coluna < 7; $coluna++){ $pos2 = $cont - $pos; if(empty($dias[$pos2]))echo "<td><center>-</center></td>"; else{ $busca_data = array_search($dias[$pos2],$dias_reservas); if ($dias_reservas[$busca_data] === $dias[$pos2]) { echo "<td bgColor='darkgray'><b><center><font color='blue'>".$dias[$pos2]."</font></center></b></td>"; } else { echo "<td bgColor='gray'><center>".$dias[$pos2]."</center></td>"; } }//Fim do else $cont++; }//Fim do for echo "</tr>"; }//Fim do for echo "</table>"; ?> </td> </tr> <? } ?>Ok!O problema é que se a reserva for feita no último dia do mês corrente, no mês seguinte não vai aparecer reservado. Por causa dessa consulta...$sql1 = mysql_query("SELECT * FROM reservas WHERE data_inicio BETWEEN '$data_inicio' AND '$data_fim' AND id_imovel = '$imovel'");Como poderia fazer nesse caso?Outra pergunta, estou montando agora o sistema que vai cadastrar as reservas por imóvel, estou travado na parte onde vai verificar as datas que está ou não reservado o imóvel, tipo, cada reserva possui um data de entrada e de saída, aí para um cadastro de reserva normal ele tem que verificar se no período escolhido não vai estar chocando com uma reserva já feita, como seria basicamente essa lógica (estou apanhando disso)...Grato. Quote Link to comment Share on other sites More sharing options...
0 mJi Posted November 22, 2011 Report Share Posted November 22, 2011 A coluna 'data_inicio' da tabela 'reservas', é de que tipo? Quote Link to comment Share on other sites More sharing options...
Question
lha2
Olá novamente, estou desenvolvendo uma aplicação de reservas com calendário de disponibilidade, estou com uma dúvida num FOR, segue o código...:
O resultado do for acima é:
Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 4 [4] => 9 [5] => 10 [6] => 12 [7] => 13 [8] => 14 )
Está desordenado e com datas que não estão no banco, alguém poderia me ajudar?
Link to comment
Share on other sites
12 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.