Операторы сравнения, как это видно из их названия, позволяют сравнивать между собой два значения. Также вам возможно будет интересно ознакомиться с разделом Сравнение типов, в котором приведено большое количество соответствующих примеров.
Пример | Название | Результат |
---|---|---|
$a == $b | Равно | TRUE если $a равно $b после преобразования типов. |
$a === $b | Тождественно равно | TRUE если $a равно $b и имеет тот же тип. (добавлено в PHP 4) |
$a != $b | Не равно | TRUE если $a не равно $b после преобразования типов. |
$a <> $b | Не равно | TRUE если $a не равно $b. |
$a !== $b | Тождественно не равно | TRUE если $a не равно $b или в случае, если они разных типов (добавлено в PHP 4) |
$a < $b | Меньше | TRUE если $a строго меньше $b. |
$a > $b | Больше | TRUE если $a строго больше $b. |
$a <= $b | Меньше или равно | TRUE если $a is меньше или равно $b. |
$a >= $b | Больше или равно | TRUE если $a больше или равно $b. |
В случае, если вы сравниваете целое со строкой или строку, содержащую число, строка будет преобразована к числу. В случае, если вы сравниваете две числовые строки, они сравниваются как целые числа. Эти правила также распространяются на оператор switch. Преобразование типов не происходит при использовании === или !== так как в этом случае кроме самих значений сравниваются еще и типы.
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
switch ("a") {
case 0:
echo "0";
break;
case "a": // Эта ветка никогда не будет достигнута, так как "a" уже сопоставленно с 0
echo "a";
break;
}
?>
Для различных типов сравнение происходит в соответствии со следующей таблицей (по порядку).
Тип операнда 1 | Тип операнда 2 | Результат |
---|---|---|
null или string | string | NULL преобразуется в "", числовое или лексическое сравнение |
bool или null | что угодно | Преобразуется в bool, FALSE < TRUE |
object | object | Встроенные классы могут определять свои собственные правила сравнения, объекты разных классов не сравниваются, объекты одного класса - сравниваются свойства тем же способом, что и в массивах (PHP 4), в PHP 5 есть свое собственное объяснение |
string, resource или number | string, resource или number | Строки и ресурсы переводятся в числа, обычная математика |
array | array | Массивы с меньшим числом элементов считаются меньше, если ключ из первого операнда не найден во втором операнде - массивы не могут сравниваться, иначе идет сравнение соответствующих значений (смотри последующий пример) |
array | что угодно | array всегда больше |
object | что угодно | object всегда больше |
Пример #1 Транскрипция сравнения обычных массивов
<?php
// Массивы сравниваются наподобие этого кода при сравнении стандартными операторами
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // не могут быть сравнимы
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
?>
Смотрите также strcasecmp(), strcmp(), операторы массивов, и раздел руководства Типы.
Из-за особого внутреннего представления float, не нужно сравнивать два float числа между собой.
Для более подробной информации смотрите документацию по типу float.
Еще одним условным оператором является тернарный оператор "?:".
Пример #2 Присваивание значения по умолчанию
<?php
// Пример использования тернарного оператора
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
// Приведенный выше код аналогичен следующему блоку с использованием if/else
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
Начиная с версии PHP 5.3 также стало возможным не писать среднюю часть тернарного оператора. Выражение expr1 ?: expr3 возвращает expr1 если expr1 имеет значение TRUE, и expr3 в другом случае.
Замечание: Пожалуйста, учтите, что тернарный оператор является выражением и трактуется не как переменная, а как результат выражения. Это важно знать, если вы хотите вернуть переменную по ссылке. Выражение return $var == 42 ? $a : $b; не будет работать в функции, возвращающей значение по ссылке, а в более поздних версиях PHP также будет выдано предупреждение.
Замечание:
Рекомендуется избегать "нагромождения" тернарных выражений. Поведение PHP неочевидно при использовании нескольких тернарных операторов в одном выражении:
Пример #3 Неочевидное поведение тернарного оператора
<?php
// на первый взгляд, следующий код должен вывести 'true'
echo (true?'true':false?'t':'f');
// однако, он выводит 't'
// это происходит потому, что тернарные выражения вычисляются слева направо
// это намного более очевидная версия вышеприведенного кода
echo ((true ? 'true' : false) ? 't' : 'f');
// здесь вы можете видеть, что первое выражение вычисляется в 'true', которое
// в свою очередь вычисляется в (bool)true, таким образом возвращая истинную ветвь
// второго тернарного выражения.
?>