Operadores DIV e MOD em PHP

Estes dias estava lendo um livro de algoritmos e tinha alguns algoritmos utilizando DIV e MOD.

A idéia seria pegar as partes de uma data no formato AAAAMMDD e colocar no formato DDMMAAAA.

Claro, eu como programador PHP já fui logo pensando em strpos(), mas ai o livro mostrava uma abordagem matemática interessante e global para outras linguagem.

 lang="sql

data <- 20110829

ano <- data DIV 10000 // retorna 2011

dia <- data MOD 100  // retorna 29

A lógica é a seguinte:

Pegar a data e dividir por 10000 retorna o ano.

Como é uma divisão exata, o total zeros do divisor é o total de números que vão ser removido e o quociente é o ano que desejamos.

 lang="sql

2011|0829  // estes 4 dígitos finais serão removidos

   1|0000

Pegar a data e fazer uma operação com Módulo 100 retona o dia.

O total de zeros passados no módulo é o total de digitos finais do número que vão ser retornados:

 lang="sql

201108|29 // estes 2 digitos finais serão retornados

     1|00

Tá e como fica o Mês?

Bem, o mês… eh… ahum, sim o mês! Claro o mês! 😀

O Mês está no meio, estão seguindo a lógica da pra criar algo:

 lang="sql

data <- 20110829

ano <- data DIV 10000 // retorna 2011



auxiliarMes <- data DIV 100 // retorna 201108

mes <- auxiliarMes MOD 100 // retorna 08



dia <- data MOD 100  // retorna 29

Vou deixar você entender sozinho o que aconteceu ali em cima.

O PHP no seu núcleo não tem um operador para DIV somente para MOD, que é o % (porcento).

Ai para inventar moda, e com um jeitinho brasileiro criei estas duas funções:



/**

 * Retorna o módulo de uma divisão

 */

function MOD( $number, $base ) {

	return $number % $base;

}

/**

 * Retorna o resto de uma divisão

 */

function DIV( $number, $base ) {

	return floor( $number / $base );

}

Na função DIV eu utilizei a função nativa do PHP floor() que arredonda para baixo, pois dividindo o número 20110829 por 10000 resultaria no quociente 2011.0829.

Ai, no caso de datas fica assim:



$data = 20110829;

$dia = MOD( $data, 100 );

$auxiliarMes = DIV( $data, 100 );

$mes = MOD( $auxiliarMes, 100 );

$ano = DIV( $data, 10000 );



echo sprintf("%02s%02s%04s",$dia,$mes,$ano);

Utilizei a função de formatação sprintf(), pois caso o dia ou o mês precise do zero na frente, pelo fato de ser uma divisão não retornaria o zero na frente.

Bom, é isto, espero que tenha ajudado os malucos!