Операторы сравнения в PHP. В чем различия сравнения строк, чисел и массивов?

операторы сравнения в php. в чем различия сравнения строк, чисел и массивов?

Осмысление операторов сравнения

Операторы сравнения в PHP выполняют строго то, что исходит из их названия. Сравнивать можно любые типы данных: строки, целые числа, дробные числа, массивы и т.д. Результатом выражения всегда является значение логического типа: true или false.

Сравнение в совокупности с логическими операторами могут формировать сложные цепочки утверждений. Например, «Если два числа равны, а два других числа не равны, то результат всего выражения является верным». Основное место использования операторов сравнения – это построение условных конструкций, которые позволяют выполнять одно действие, если входящий параметр равен true и другое действие, если он равен false.

Прежде чем мы рассмотрим список операторов, относящихся к данному типу, отметим несколько важных моментов:

  • PHP осуществляет автоматическое преобразование типов данных. В зависимости от контекста, существует два вида операторов сравнения: «обычные» и «тождественные».
  • Когда обычный оператор пытается сравнить два значения, он сначала приводит их к одному типу данных, а затем осуществляет сравнение.
  • Тождественный оператор не приводит значения к одному типу данных. Поэтому, если переданы значения разных типов, то сравнение как таковое произведено не будет.

Таблица с описанием операторов сравнения:

Пример Название Результат
(возвращает «true»)
$var1 == $var2 Равенство Если $var1 и $var2 равны
$var1 === $var2 Тождественное равенство Если $var1 и $var2 равны, а также одного типа
$var1 != $var2 Не равенство Если $var1 и $var2 не равны
$var1 !== $var2 Тождественное не равенство Если $var1 и $var2 не равны, а также одного типа
$var1 < $var2 Меньше Если $var1 меньше $var2
$var1 > $var2 Больше Если $var1 больше $var2
$var1 <= $var2 Меньше или равно Если $var1 меньше или равно $var2
$var1 >= $var2 Больше или равно Если $var1 больше или равно $var2

Ниже мы рассматриваем несколько примеров по использованию операторов сравнения в PHP, а более подробное рассмотрение для различных типов данных приводится далее в статье.

//Примеры простых операций сравнения
var_dump('Кошка' === 'Собака'); //Результат: bool(false)
var_dump('Кошка' !== 'Собака'); //Результат: bool(true)
var_dump(145 > 10); //Результат: bool(true)


//Тождественное и обычное сравнение
var_dump('45' == 45); //Результат: bool(true)
var_dump('45' === 45); //Результат: bool(false)


//Сравнение между результатами выражений
var_dump((150*10) >= (1700 - 200)); //Результат: bool(true)

Важно
Если происходит сравнение числа со строкой, то строка будет преобразована в число. Это обусловлено механизмом неявного преобразования типов, встроенного в интерпретатор.

Сравнение строк

При сравнении строк в PHP настоятельно рекомендуется использовать только тождественные операторы. Не допускайте возможные автоматические преобразования типов. Не исключены ситуации, которые вы не сможете предусмотреть, и такое поведение станет трудноуловимой ошибкой в вашем коде.

Для сравнения строк на равенство используйте операторы «===» и «!==». Они учитывают регистр символов. Строка «сыр» и «CыР» не равны, так как буквы в разных регистрах считаются различными.

//Сравнение строк по содержанию
var_dump('Апельсин' === 'АпелЬсИн'); //Результат: bool(false)
var_dump('Апельсин' !== 'Грейпфрут'); //Результат: bool(true)


//Ошибка при не тождественном сравнении
var_dump('15Блинчиков' == 15); //Результат: bool(true)

Сравнение чисел

В PHP сравнение целых чисел не вызывает трудностей. Использование соответствующих операторов понятно без объяснений, но сравнение дробных чисел очень противоречиво. Два дробных числа невозможно сравнить между собой без предварительной обработки. Взгляните на приведенный ниже пример.

//Ошибка при сравнении дробных чисел. Задаем два
//дробных числа. Мы видим что они будут содержать
//одинаковые числа - 0,10
$firstFloat = 0.30 - 0.20;
$secondFloat = 0.20 - 0.10;


//Производим сравнение двух дробных чисел
var_dump($firstFloat === $secondFloat);
/*
* Результат: bool(false);
*
* Мы точно знаем что эти числа равны, но
* интерпретатор так не считает.
*/

Важно
Проблема не вызвана ошибками в работе интерпретатора PHP. Она свойственна всем компьютерам, не зависимо от языка программирования. Процессоры на физическом уровне не способны хранить точное представление дробных чисел.

Для сравнения двух дробных чисел необходимо использовать «единицу округления». Внимательно ознакомьтесь с примером, приведенным ниже.

//Решение проблемы сравнения дробных чисел
//с помощью еденицы округления ($epsilon)
$firstFloat = 0.30 - 0.20;
$secondFloat = 0.20 - 0.10;

//Единицу округления можно задать как вам
//удобно. Например, 0,001. Это повлияет на
//точность сравнения
$epsilon = 0.00001;

//Производим сравнение двух дробных чисел
var_dump(abs($firstFloat - $secondFloat) < $epsilon);
/*
* Результат: bool(true);
*
* - вычитаем одно число из другого
* - получившийся результат берем по модулю
* - Если результат меньше эпсилон, то числа равны
*/

Сравнение массивов

В сравнении массивов могут участвовать только операторы «==» «!=», «===» и «!==». Важно понимать, что массив – это контейнер, состоящий из вложенных в него значений, и в операциях сравнения участвуют именно они. То есть, сравнивая два массива, вы запускаете процесс для каждой пары ключ/значение, содержащихся в них.

Действуют они по следующему принципам:

Пример Название Результат(возвращает «true»)
$arr1 == $arr2 Равенство Если $arr1 и $arr2 содержат одни и те же пары ключ/значение
$arr1 === $arr2 Тождественное равенство Если $arr1 и $arr2 содержат одни и те же пары ключ/значение, в одинаковом порядке и с одинаковыми типами данных
$arr1 != $arr2 Не равенство Принцип работы обратен равенству
$arr1 !== $arr2 Тождественное не равенство Принцип работы обратен тождественному равенству
//Два массива с одинаковым набором и порядком пар ключ/значение
$firstArray = [
    'фрукт' => 'апельсин',
    'напиток' => 'пепси'
];
$secondArray = [
    'фрукт' => 'апельсин',
    'напиток' => 'пепси'
];
var_dump($firstArray == $secondArray); //Результат: bool(true)
var_dump($firstArray === $secondArray); //Результат: bool(true)
var_dump($firstArray != $secondArray); //Результат: bool(false)


//Два массива с одним набором и разным порядком ключ/значение
$firstArray = [
    'цвет' => 'синий',
    'стрижка' => 'короткая'
];
$secondArray = [
    'стрижка' => 'короткая',
    'цвет' => 'синий'
];
var_dump($firstArray == $secondArray); //Результат: bool(false)
var_dump($firstArray === $secondArray); //Результат: bool(false)
var_dump($firstArray != $secondArray); //Результат: bool(true)

Последние публикации