Jump to content
Fórum Script Brasil
  • 0

Dúvida com FOR


lha2

Question

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?

Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0

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.

Link to comment
Share on other sites

  • 0

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.

Link to comment
Share on other sites

  • 0
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.

Link to comment
Share on other sites

  • 0

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 for

Então ele monta o calendário com o primeiro dia de reservas sem marcar a data.

Há algo que posso fazer?

Link to comment
Share on other sites

  • 0

$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 ==!.

Link to comment
Share on other sites

  • 0

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...