Olá “gordos” de plantão. Matias Rezende para mais um artigo.
Estes dias surgiu no fórum iMasters uma dúvida sobre como criar um script para verificar se a placa está no rodízio de veículos da cidade de São Paulo. Aí eu pensei… “Interessante…” Resolvi então criar uma função que faz isto. Você passa a placa do veículo e, se quiser, uma data em específico.
Como funciona o rodízio? Para cada dia da semana (segunda a sexta), dois finais de placa estão proibidos de circular em uma parte da cidade de São Paulo, segundo a listagem abaixo:
- Segunda-feira – final 1 e 2
- Terça-feira – final 3 e 4
- Quarta-feira – final 5 e 6
- Quinta-feira – final 7 e 8
- Sexta-feira – final 9 e 0
Veja o link da CET-SP para maiores informações.
Então, vamos à função.
/**
* Função que verifica se uma placa está no rodízio ou não.
* Pode receber um parâmetro de data, onde será verificado se a placa estará ou não no rodízio naquela data
* Voce DEVE definir o timezone, utilizando a função set_default_timezone_set(), senão será exibido um Warning.
*
* @author Matias Rezende - contato@matiasrezende.com.br
* @license http://creativecommons.org/licenses/by-sa/2.5/br/
* @version 1.0
* @see http://www.cetsp.com.br/internew/informativo/pico/pico.asp
* @param string $placa - a placa a ser verificada, no formato AAA-0000 (maiúsculas ou minúsculas)
* @param string $data - a data a ser verificada, no formato DD/MM/AAAA. Se não for dado, será utilizada a data atual
* @return boolean - verdadeiro se a placa estiver no rodízio e falso se não estiver.
*/
function VerificaRodizioSaoPaulo($placa, $data = null)
{
// verificamos se a placa está no formato correto, sendo aceito maiúscula ou minúscula
// se não for válida, envia uma exceção
if(!preg_match('^[a-zA-Z]{3}\-[0-9]{4}^',$placa)) throw new InvalidArgumentException('A placa passada não é válida segundo o formato AAA-0000.');
// verificamos também se a data passada está no formato correto
// se não estiver, envia uma excceção.
if(!empty($data) && !preg_match('^[0-9]{2}/[0-9]{2}/[0-9]{4}^',$data)) throw new InvalidArgumentException('A data passada não é válida segundo o formato DD/MM/AAAA.');
// passando as validações, inicia o script
// pegamos o último número da placa
$finalPlaca = substr($placa,-1);
// definimos as placas que estarão no rodízio por dia da semana
$rodizio = array(
// segunda feira
1 => array(1,2),
// terça feira
2 => array(3,4),
// quarta feira
3 => array(5,6),
// quinta feira
4 => array(7,8),
// sexta feira
5 => array(9,0));
// Se for passada a data atual, $diaSemana terá o dia da semana da data passada. Senão, terá o dia da semana atual,
// em formato de 0 a 6, onde 0 é domingo e 6 é sábado
$diaSemana = ($data === null) ? date('w') : date('w',strtotime(implode('-',array_reverse(explode('/',$data)))));
// Verificamos aqui se está definido o array com o índice do dia da semana
// se não estiver, significa que a data passada é sábado ou domingo.
if(!isset($rodizio[$diaSemana])) return false;
// se estiver, verifica se dentro do array do dia passado está o final da placa.
// se estiver, retorna true. Senão, retorna false
else return (in_array($finalPlaca,$rodizio[$diaSemana])) ? true : false;
}
Vamos explicar cada parte:
function VerificaRodizioSaoPaulo($placa, $data = null)
{
Recebemos 2 parâmetros. O primeiro, a placa no formato AAA-0000 e a data no formato DD/MM/AAAA (que não é obrigatória). Caso não seja passado nenhuma data, a $data será null e será utilizada a data de hoje.
if(!preg_match('^[a-zA-Z]{3}\-[0-9]{4}^',$placa)) throw new InvalidArgumentException('A placa passada não é válida segundo o formato AAA-0000.');
if(!empty($data) && !preg_match('^[0-9]{2}/[0-9]{2}/[0-9]{4}^',$data)) throw new InvalidArgumentException('A data passada não é válida segundo o formato DD/MM/AAAA.');
Aqui verificamos se a placa passada está no formato correto. Além disto, se foi passada a data e se esta data está no formato correto. Se não estiver, dispara uma exceção de argumento inválido para cada uma delas.
$finalPlaca = substr($placa,-1);
Pegamos então o final da placa.
$rodizio = array( // segunda feira 1 => array(1,2), // terça feira 2 => array(3,4), // quarta feira 3 => array(5,6), // quinta feira 4 => array(7,8), // sexta feira 5 => array(9,0));
Aqui criamos um array contendo os dias da semana como índice (no formato date(‘w’)) e como valor, um array contendo as placas do rodízio daquele dia.
$diaSemana = ($data === null) ? date('w') : date('w',strtotime(implode('-',array_reverse(explode('/',$data)))));
Aqui fazemos um if ternário para verificar se foi passada a data. Caso tenha sido passado uma data, fazemos a formatação da data para um formato aceito pela função strtotime(que recebe a data no formato americano e converte para o timestamp). Para isto, utilizamos o explode (para separar a data por barra), o array_reverse(para colocar como AAAA MM DD) e o implode para juntar as partes do array (para deixar como AAAA-MM-DD).
É muito importante que seja definido o timezone local, preferencialmente em um arquivo de configuração, mas pode ser antes de chamar a função, para evitar o aparecimento de erros. Para isto, utilize a função date_default_timezone_set() . Veja também a lista de timezones suportados.
if(!isset($rodizio[$diaSemana])) return false;
Se não estiver setado o array com este índice, significa que o dia passado é sábado ou domingo (dias que não tem rodízio, então retorno falso).
else return (in_array($finalPlaca,$rodizio[$diaSemana])) ? true : false;
Aqui fazemos o teste. Se o final da placa estiver dentro do array do dia da semana (ou seja, se placa estiver no rodizio naquele dia), retorna true. Senão, retorna false.
Gostou? Vejamos então alguns exemplos de uso.
// definimos o timezone como sendo São Paulo
date_default_timezone_set('America/Sao_Paulo');
try
{
// sem parâmetro de data
echo (VerificaRodizioSaoPaulo('AAA-1234')) ? 'A placa está no rodízio<br>': 'A placa não está no rodízio<br>';
// com parâmetro de data de segunda a sexta
echo (VerificaRodizioSaoPaulo('AAA-1234','01/01/2010')) ? 'A placa está no rodízio<br>': 'A placa não está no rodízio<br>';
// com parâmetro de data sábado ou domingo
echo (VerificaRodizioSaoPaulo('AAA-1234','02/01/2010')) ? 'A placa está no rodízio<br>': 'A placa não está no rodízio<br>';
// com parâmetro de data inválida
echo (VerificaRodizioSaoPaulo('AAA-1234','3002/2009')) ? 'A placa está no rodízio': 'A placa não está no rodízio';
}
catch (Exception $e)
{
echo $e->getMessage();
}
Espero que tenham gostado da função. Qualquer coisa, comentem!!








Muito bom! A função é bem prática e de fácil implementação. Parabéns, é um ótimo script
Ficou muito bom, cara! Excelente explicação. ^^
Como posso usar esta função no excel, estou precisando dessa informação numa planilha, para saber se posso contratar um veiculo de transporte hoje e amanhã, sendo que esta informação deve me informar se o veiculo esta no rodizio hoje e amanhã
Valeu
e parabens
Aff!!!!! Tendi tudo. Tão facinnnnn. Faço de cór.
Inté decorei.Aff…