Определение отношений между двумя строками не так очевидно, как те же операции с числами. Главная проблема заключается в контексте. Если вы сравниваете строки в двоичной форме, то два слова "Macro" и "macro" будут полностью различны, поскольку байтовое значение символа "М", как и должно быть, отличается от значения символа "т". Однако, в зависимости от ваших требований, "Macro" и "macro" могут быть эквивалентны и должны трактоваться именно так.
Наиболее простой способ сравнения двух строк предусматривает использование встроенных операций сравнения РНР. Однако есть несколько ловушек, о которых следует знать. Рассмотрим, например, следующее выражение:
echo (0 == 'ОМ;
Из-за того, что один из операндов является целым числом, строка ' 0' неявно также конвертируется в целое перед выполнением сравнения, приводя к результату, равному 1. Пока, на первый взгляд, это не кажется проблемой, но очень легко становится ею, когда встретится что-то вроде:
(О == 'Macro');
Так как строка 'Macro' конвертируется в целое значение 0 при вычислении выражения, результатом также будет true, что на выходе даст 1. Скорее всего, вы никогда не захотите, чтобы такое случилось в вашем коде, поэтому никогда не применяйте простые операции сравнения при работе со строками, если только точно не уверены в том, что делаете.
Вместо этого необходимо пользоваться операциями сравнения с контролем типов, которые могут проверить, что два сравниваемых операнда относятся к одному типу данных, прежде чем в действительности сравнивать их значения. Например, выражение:
(О === 'Macro');
вернет значение false, что, очевидно, и ожидалось получить. То же произойдет с выражением:
(О = = = ' О ' ) ;
Самый аккуратный способ сравнения двух строк, однако, обеспечивает функция
strcmpO:
int strcmp($vall, $val2);
Результат, возвращаемый strcmpO, зависит от алфавитного порядка двух строк.
Если $vall и $val2 идентичны, strcmpO вернет 0. Следует помнить, что функция strcmpO выполняет сравнение, чувствительное к регистру, поэтому, например, "Macro" и "macro" не будут идентичны.
Если два значения не эквивалентны, сравнение выполняется в соответствии с текущими локальными установками клиента — другими словами, использование алфавитных правил сортировки зависит от локальной среды, в которой выполняется сценарий. Если $vall по алфавиту предшествует $val2, результат будет отрицательным, в противном случае — положительным.
Например, при использовании локальных установок на компьютере автора (Canadian-English), получаются следующие результаты:
echo strcmp('Apple','Banana'); // возвращает < 0
echo strcmp('apple','Apple'); // возвращает > О
echo s t r c m p { ' 1 ' , ' t e s t ' ) ; // возвращает < О
Как видите, цифры имеют меньшее контекстное значение, чем буквы, а заглавные буквы — меньшее контекстное значение, чем прописные. В канадском английском региональном стандарте это также касается двоичных значений каждого символа, но это не всегда верно, в частности для тех языков, где комбинации символов рассматриваются как один символ (например, 'ае' в немецком, или 'cz' — в чешском).
Если вам нужно реализовать сравнение строк, не чувствительное к регистру, на этот случай РНР предлагает функцию strcasecmp (), которая принимает те же параметры, что и strcmp(): echo strcasecmp('Macro','macro'); // возвращает О
|