Forum und email

Operadores de Comparación

Los operadores de comparación, como su nombre indica, le permiten comparar dos valores. Puede que también se encuentre interesado en consultar las tablas de comparación de tipos, ya que éstas muestran ejemplos de varios tipos de comparaciones relacionadas con tipos.

Operadores de Comparación
Ejemplo Nombre Resultado
$a == $b Igual TRUE si $a es igual a $b.
$a === $b Idéntico TRUE si $a es igual a $b, y son del mismo tipo. (A partir de PHP 4)
$a != $b Diferente TRUE si $a no es igual a $b.
$a <> $b Diferente TRUE si $a no es igual a $b.
$a !== $b No idénticos TRUE si $a no es igual a $b, o si no son del mismo tipo. (A partir de PHP 4)
$a < $b Menor que TRUE si $a es escrictamente menor que $b.
$a > $b Mayor que TRUE si $a es estrictamente mayor que $b.
$a <= $b Menor o igual que TRUE si $a es menor o igual que $b.
$a >= $b Mayor o igual que TRUE si $a es mayor o igual que $b.

Si compara un entero con una cadena, la cadena es convertida a un número. Si compara dos cadenas numéricas, ellas son comparadas como enteros. Estas reglas también se aplican a la sentencia switch.

<?php
var_dump
(== "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("1" == "1e0"); // 1 == 1 -> true

switch ("a") {
case 
0:
    echo 
"0";
    break;
case 
"a"// nunca se ejecuta ya que "a" ya ha coincidido con 0
    
echo "a";
    break;
}
?>

Para varios tipos, la comparación se realiza de acuerdo con la siguient tabla (en orden).

Comparación con Varios Tipos
Tipo del Operando 1 Tipo del Operando 2 Resultado
null o string string Convertir NULL a "", comparación numérica o de léxico
bool o null cualquiera Convertir a bool, FALSE < TRUE
object object Las clases internas pueden definir su propia comparación, clases diferentes son incomparables, la misma clase - comparan propiedades en la misma forma que las matrices (PHP 4), PHP 5 tiene su propia explicación
string, resource o number string, resource o number Traducir las cadenas y recursos a números, matemática usual
array array Una matriz con menos elementos es menor, si una clave del operando 1 no se encuentra en el operando 2 entonces las matrices son incomparables, de otra forma - comparar valor por valor (vea el siguiente ejemplo)
array cualquiera array es siempre mayor
object cualquiera object es siempre mayor

Example#1 Transcripción de la comparación de matrices estándar

<?php
// Las matrices son comparadas de esta forma con los operadores de comparación estándar
function comparacion_matrices_estandar($op1$op2)
{
    if (
count($op1) < count($op2)) {
        return -
1// $op1 < $op2
    
} elseif (count($op1) > count($op2)) {
        return 
1// $op1 > $op2
    
}
    foreach (
$op1 as $clave => $val) {
        if (!
array_key_exists($clave$op2)) {
            return 
null// incomparable
        
} elseif ($val $op2[$clave]) {
            return -
1;
        } elseif (
$val $op2[$clave]) {
            return 
1;
        }
    }
    return 
0// $op1 == $op2
}
?>

Vea también strcasecmp(), strcmp(), Operadores de matriz, y la sección del manual sobre Tipos.

Operador Ternario

Otro operador condicional es el operador "?:" (o ternario).

Example#2 Asignación de un valor predeterminado

<?php
// Ejemplo de uso de: el Operador Ternario
$accion = (empty($_POST['accion'])) ? 'predeterminada' $_POST['accion'];

// La línea anterior es idéntica a esta sentencia if/else
if (empty($_POST['accion'])) {
    
$accion 'predeterminada';
} else {
    
$accion $_POST['accion'];
}

?>
La expresión (expr1) ? (expr2) : (expr3) evalúa a expr2 si expr1 evalúa a TRUE, y expr3 si expr1 evalúa a FALSE.

Note: Por favor note que el operador ternario es una sentencia, y que no evalúa a una variable, sino al resultado de una sentencia. Es importante saber esto si se desea devolver una variable por referencia. La sentencia return $var == 42 ? $a : $b; en una función con retorno-por-referencia no funcionará por lo que se ha mencionado y una advertencia es generada en versiones posteriores de PHP.

Note: Es recomendable que evite "apilar" las expresiones ternarias. El comportamiente de PHP cuando se usa más de un operador ternario al interior de una sentencia no es obvio:

Example#3 Comportamiento Ternario No-Obvio

<?php
// a primera vista, lo siguiente parece imprimir 'true'
echo (true?'true':false?'t':'f');

// sin embargo, la salida real de la línea anterior es 't'
// esto se debe a que las expresiones ternarias son evaluadas de izquierda a
// derecha

// la siguiente es una versión más obvia del código presentado anteriormente
echo ((true 'true' 'false') ? 't' 'f');

// aquí puede ver que la primera expresión es evaluada como 'true', la cual
// en su lugar evalúa a (bool)true, devolviendo por lo tanto la rama de
// verdad de la segunda expresión ternaria.
?>