HOME PAGE JAVASCRIPT
Botões Cálculos Datas Essenciais Janelas Flutuantes Menus
HTML CSS FLASH PHP ASP GERADORES CORES MISCELANEA Contato  






Comparação de valores em PHP

No PHP existem algumas particularidades quando estamos tratando de comparação de valores. Essas particularidades podem deixar um programador confuso por algum tempo sem saber exatamente o que está acontecendo com seu código. Para evitar esse tipo de problema, vou citar alguns exemplos interessantes que podem deixar seu código em maus lençóis.

Sabemos que o PHP converte tipos de maneira transparente, ou seja, eu posso atribuir qualquer valor para qualquer variável sem que ocorram erros. Isso é algo que, concordo, simplifica a programação, porém traz problemas para programadores menos atentos. Note o exemplo:

 
PHP
  1. <?php
  2. $foo = 0;
  3. $bar = false;
  4.  
  5. if($foo == false)
  6. echo “Foo é falso!”;
  7.  
  8. if($bar == false)
  9. echo “Bar é falso!”;
  10. ?>
  11.  

Você, naturalmente, espera que a mensagem “Foo é falso” não seja mostrada na tela, mas na verdade ambas serão mostradas. Sim, pois zero e false são valores falsos para o PHP. Eles são iguais, porém não idênticos.

No exemplo abaixo você verá um problema parecido:

 
PHP
  1. <?php
  2. $foo = “123456”;
  3.  
  4. if($foo == 123456)
  5. echo “Foo é 123456”;
  6. else
  7. echo “Foo não é um número”;
  8. ?>
O PHP converte, de maneira transparente, o valor string “123456” para um valor do tipo numérico 123456. Esses valores são iguais, também, porém não idênticos. Isso dificilmente será um problema, mas pode ser um grande problema se pegarmos o exemplo abaixo, aonde, na hora da comparação, o PHP irá pegar o valor numérico da string e converter num valor de tipo numérico e verificar com um número e retornará que a comparação é verdadeira:
 
PHP
  1. <?php
  2. $foo = “123ab”;
  3.  
  4. if($foo == 123)
  5. echo “Sim, no IF”;
  6. else
  7. echo “Sim, no ELSE”;
  8. ?>

O que será mostrado na tela é “Sim, no IF”, por conta da conversão transparente que o php fez.

A solução para todos esse problemas é o operador de comparação “idêntico” (===) que, além de verificar o conteúdo da variável, verifica também seu tipo. O contrário de “idêntico” (não-idêntico) é escrito “!==”. Abaixo seguem os exemplos utilizando o operador “idêntico”.

 
PHP
  1. <?php
  2.  
  3. // Somente a segunda mensagem será mostrada
  4. $foo = 0;
  5. $bar = false;
  6.  
  7. if($foo === false)
  8. echo “Foo é falso!”;
  9.  
  10. if($bar === false)
  11. echo “Bar é falso!”;
  12.  
  13. // Irá mostrar “Foo não é um número”
  14. $foo = “123456”;
  15.  
  16. if($foo === 123456)
  17. echo “Foo é 123456”;
  18. else
  19. echo “Foo não é um número”;
  20.  
  21. // Irá mostrar a mensagem do ELSE
  22. $foo = “123ab”;
  23.  
  24. if($foo === 123)
  25. echo “Sim, no IF”;
  26. else
  27. echo “Sim, no ELSE”;
  28.  
  29. ?>

 

Portanto, sempre deve-se usar o operador “idêntico” quando formos escrever páginas aonde o conteúdo da variável deve ser exatamente o que desejarmos, incluindo o tipo da variável.

Indo mais além na comparação de variáveis, o PHP fornece algumas funções para comparação de variáveis com conteúdo alfa-numérico (strings).

strcmp($var1, $var2) - Nesta função podemos passar dois parâmetros e, dependendo do retorno sabemos qual delas é maior, qual é menor e se são iguais. Ela retorna >0 se $var1 for maior que $var2, <0 se $var1 menor que $var2 e retorna zero se ambas forem iguais. Essa função é case-sensitive e “123” é diferente de 123. Para uma comparação case-insensitive use a função strcasecmp(). Essa comparação é segura pois é feita através dos valores binários de cada caracter..

 
PHP
  1. <?php
  2.  
  3. $foo = "A";
  4. $bar = "a";
  5.  
  6. if(strcmp($foo, $bar) == 0)
  7. echo "Variáveis idênticas";
  8. elseif(strcmp($foo, $bar) > 0)
  9. echo "$foo é maior que $bar";
  10. elseif(strcmp($foo, $bar) < 0)
  11. echo "$bar é maior que $foo";
  12.  
  13. if(strcasecmp($foo, $bar) == 0)
  14. echo "Variáveis idênticas";
  15. elseif(strcasecmp($foo, $bar) > 0)
  16. echo "$foo é maior que $bar";
  17. elseif(strcasecmp($foo, $bar) < 0)
  18. echo "$bar é maior que $foo";
  19.  
  20. ?>
resultado:
a é maior que A
Variáveis idênticas

strncasecmp($var1, $var2, $len) – Nesta função nós podemos comparar se um número $len de caracteres entre $var1 e $var2 é igual, retornando da mesma maneira que strcmp e strcasecmp. Este tipo de comparação TAMBÉM é case sensitive.

 
PHP
  1. <?php
  2.  
  3. $foo = "Julio Schneider";
  4. $bar = "Julio Cesar, O Imperador";
  5.  
  6. if(strncasecmp($foo, $bar, 7) == 0)
  7. echo "Dos 7 caracteres pesquisados, os que existem em ambas são idênticos";
  8. elseif(strncasecmp($foo, $bar, 7) > 0)
  9. echo "Dos 7 caracteres pesquisados, os que existem em $foo são maiores";
  10. elseif(strncasecmp($foo, $bar, 7) < 0)
  11. echo "Dos 7 caracteres pesquisados, os que existem em $bar são maiores";
  12.  
  13. ?>
resultado:
Dos 7 caracteres pesquisados, os que existem em Julio Schneider são maiores

strnatcasecmp($var1, $var2) – Compara strings do jeito que um ser-humano faz. Para maiores informações, leia o artigo de Martin Pool chamado “Natural Order String Comparison” (Comparação de Strings em Ordem Natual – numa tradução livre). Não diferencia maiúsculas de minúsculas.

 
PHP
  1. <?php
  2.  
  3. $foo = 200;
  4. $bar = 111;
  5.  
  6. if(strnatcasecmp($foo, $bar) == 0)
  7. echo "$foo e $bar são idênticos";
  8. elseif(strnatcasecmp($foo, $bar) > 0)
  9. echo "$bar vem antes de $foo";
  10. elseif(strnatcasecmp($foo, $bar) < 0)
  11. echo "$foo vem antes de $bar";
  12.  
  13. ?>
resultado:
111 vem antes de 200

crédito:
Julio Schneider.