lha2 Postado Novembro 9, 2011 Denunciar Share Postado Novembro 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 mJi Postado Novembro 10, 2011 Denunciar Share Postado Novembro 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 MTavares Postado Novembro 10, 2011 Denunciar Share Postado Novembro 10, 2011 (editado) 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. Editado Novembro 10, 2011 por MTavares Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lha2 Postado Novembro 10, 2011 Autor Denunciar Share Postado Novembro 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Willian Gustavo Veiga Postado Novembro 10, 2011 Denunciar Share Postado Novembro 10, 2011 Li rapidamente seu post. Pesquise sobre ORDER BY.Um abraço. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 mJi Postado Novembro 11, 2011 Denunciar Share Postado Novembro 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lha2 Postado Novembro 12, 2011 Autor Denunciar Share Postado Novembro 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 mJi Postado Novembro 12, 2011 Denunciar Share Postado Novembro 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 ==!. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lha2 Postado Novembro 13, 2011 Autor Denunciar Share Postado Novembro 13, 2011 Amigão, como poderia fazer isso? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 mJi Postado Novembro 13, 2011 Denunciar Share Postado Novembro 13, 2011 Amigão, como poderia fazer isso?Já falei, procure informações sobre o operador === (ou !==) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lha2 Postado Novembro 15, 2011 Autor Denunciar Share Postado Novembro 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... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lha2 Postado Novembro 21, 2011 Autor Denunciar Share Postado Novembro 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 mJi Postado Novembro 22, 2011 Denunciar Share Postado Novembro 22, 2011 A coluna 'data_inicio' da tabela 'reservas', é de que tipo? Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
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 para o comentário
Compartilhar em outros sites
12 respostass a esta questão
Posts Recomendados
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.