Php сравнение строк на схожесть. Практика PHP: сравнение строк. Синтаксис и семантика

В этой главе описаны операторы сравнения. Эти операторы проверяют равенство (такое как равно, меньше, тождественно равно и т.д.) между двумя значениями и возвращают true или false в зависимости от того, как соотносятся операнды. Операторы сравнения всегда возвращают логические значения, и эти значения чаще всего применяются в таких операторах как , while или for для управления ходом исполнения программы.

Операторы сравнения
Пример Название Результат
$i == $y Равно TRUE если $i равно $y после преобразования типов данных.
$i === $y Идентично TRUE если $i равно $y и имеет тот же тип данных.
$i != $y Не равно
$i <> $y Не равно TRUE если $i не равно $y после преобразования типов данных.
$i !== $y Не идентично TRUE если $i не равно $y или они разных типов.
$i < $y Меньше TRUE если $i строго меньше $y.
$i > $y Больше TRUE если $i строго больше $y.
$i <= $y Меньше или равно TRUE если $i меньше или равно $y.
$i >= $y Больше или равно TRUE если $i больше или равно $y.

Примечание: если попытаться вывести результат операции сравнения на экран, значение true отобразится в окне браузера как 1. Значение false соответствует числу 0 и не отображается на экран (в принципе это вы должны помнить из описания типа boolean). Если вы хотите увидеть результат в виде true или false используйте функцию var_dump() .

Так же стоит отметить: если сравнивается строка с числом или две строки, которые содержат числа, каждая строка будет преобразована в число, и сравниваться они будут как числа.

Оператор == (равенства)

Оператор == (равенства ) принимает операнды любого типа, если два операнда равны, возвращается значение true , в противном случае - false .

Если операнды имеют разные типы данных, PHP попытается преобразовать их перед сравнением к одному типу, например такое выражение "4" == 4 вернёт значение true , так как PHP автоматически приведет сравниваемые значения к одному типу данных. Аналогично, выражение $a == 1 вернёт значение true , если переменная $a содержит значение 1. Если требуется избежать неявного преобразования типов при сравнении, то следует использовать оператор идентичности, который будет рассмотрен далее.

Оператор === (идентичности)

Оператор === (идентичности ) принимает операнды любого типа и возвращает true , если их значения совпадают (равны), и false , если они различны. Чем же он отличается от оператора равенства? Оператор идентичности проверяет два операнда на «идентичность», руководствуясь строгим определением совпадения, это означает, что помимо равенства самих значений операндов, они также должны относиться к одному и тому же типу данных. В качестве примера рассмотрим такое выражение, как 5 === "5" , результатом этого выражения будет значение false , так как значение слева является числом, а значение справа - строкой, то есть у этих значений разные типы данных. Запомните, что операторы == и === означают «равно» и «идентично/тождественно равно» .

Оператор!= или <> (неравенства)

Оператор неравенства имеет два вида: != и <> . Он является противоположностью оператора == и возвращает true , в том случае, если значения операндов не равны. Оператор неравенства возвращает false только в том случае, если значения по обе стороны от него равны друг другу.

$var2); // вернет false var_dump("Home" <> "home"); // вернет true ?>

Оператор!== (неидентичности)

Оператор!== (неидентичности ) выполняет проверку, в точности противоположную оператору === . Он возвращает true , если значения операндов не равны друг другу или не относиться к одному и тому же типу данных. В качестве примера рассмотрим следующее выражение: 7 !== "7" , оператор «неидентичности» вернет true , потому что значение слева является числом, а значение справа строкой, то есть они относятся к разным типам данных. Отсюда легко будет запомнить, что операторы!= и!== означают «не равно» и «не идентично/тождественно не равно».

Оператор > (больше)

При использовании оператора > (больше ) сравнение возвращает true только в том случае, если значение слева от оператора больше значения справа от него. Как и другие операторы, оператор > работает не только с числовыми значениями, но и со строковыми. Но как одна строка может быть больше другой?

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

3); // вернет true var_dump("Hi" > "hi"); // вернет false var_dump(1 > 1); // вернет false ?>

Оператор < (меньше)

Оператор < (меньше ) является функциональной противоположностью оператора «больше». Он возвращает true , когда значение слева от него меньше значения, находящегося справа, и false , если значение левого операнда больше правого или значения равны.

Оператор >= (больше или равно)

Оператор >= (больше или равно ) немного отличается от тех операторов сравнения, которые рассматривались ранее. Он добавляет возможность равенства двух значений по обе стороны от него, то есть, чтобы было возвращено true , значение слева от оператора должно быть больше или равно значению справа от него. Оператор «больше или равно» возвращает false , только если значение слева от него меньше, чем значение справа.

= 5); // вернет true var_dump("hi" >= "hi"); // вернет true var_dump(1 >= 2); // вернет false ?>

Оператор <= (меньше или равно )

Оператор <= (меньше или равно) похож на оператор «больше или равно». Чтобы оператор <= вернул true , значение слева от оператора должно быть меньше или равно значению справа от него. Он возвращает false , только если значение слева от него больше, чем значение справа.

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

Синтаксис:

Int strcmp(string str1, string str2)

substr_compare()

Безопасное для обработки данных в двоичной форме сравнение 2 строк со смещением, с учетом или без учета регистра (PHP 5)

Описание:

Int substr_compare (string main_str, string str, int offset [, int length [, bool case_sensitivity]])

substr_compare() сравнивает строку main_str начиная с символа, номер которого задан аргументом offset, со строкой str. В сравнении участвуют максимум length символов.

Возвращает число 0 если она больше str, и 0 если строки равны. Если length больше или равен длине main_str и offset передан, substr_compare() выводит предупреждение и возвращает FALSE.

Если case_sensitivity имеет значение TRUE, сравнение выполняется с учетом регистра.

Пример использования substr_compare()

echo substr_compare("abcde", "bc", 1, 2); // 0
echo substr_compare("abcde", "bcg", 1, 2); // 0
echo substr_compare("abcde", "BC", 1, 2, true); // 0
echo substr_compare("abcde", "bc", 1, 3); // 1
echo substr_compare("abcde", "cd", 1, 2); // -1
echo substr_compare("abcde", "abc", 5, 1); // warning
?>

Сравнивает начала строк.
Синтаксис:

Int strncmp(string str1, string str2, int len)

Эта функция отличается от strcmp() тем, что сравнивает не все слово целиком, а первые len байтов. В случае, если len меньше длины наименьшей из строк, то строки сравниваются целиком.
Эта функция сравнивает две строки посимвольно (точнее, бобайтово) и возвращает:

0 - если строки полностью совпадают;

1 - если строка str1 лексикографически меньше str2;

1 - если, наоборот, str1 "больше" str2.

Так как сравнение идет побайтово, то регистр символов влияет на результаты сравнений.

strcasecmp

Сравнивает строки без учета регистра.
Синтаксис:

Int strcasecmp(string str1, string str2)

То же самое, что и strcmp(), только при работе не учитывается регистр букв.

$str1 = "Привет!";
$str2 = "привет!";
if(!strcesecmp($str1, $str2))
echo "$str1 == $str2 при сравнении строк без учета регистра";

strncasecmp

Сравнивает начала строк без учета регистра.
Синтаксис:

Int strncasecmp(string str1, string str2, int len)

Функция strncasecmp() является комбинацией функций strcasecmp() и strncmp().

strnatcmp

Производит "естественное" сравнение строк.
Синтаксис:

Int strnatcmp(string str1, string str2)

Данная функция имитирует сравнение строк, которое использовал бы человек.

$arr1 = $arr2 = array("img12.png", "img10.png", "img2.png", "img1.png");
echo "Обычная сортировкаn";
usort($arr1, "strcmp");
print_r($arr1);
echo "nЕстенственная сортировкаn";
usort($arr2, "strnatcmp");
print_r($arr2);

Данный скприпт выведет следующее:

Обычная сортировкаArray(
=> img1.png
=> img10.png
=> img12.png
=> img2.png
)

Естественная сортировкаArray(
=> img1.png
=> img2.png
=> img10.png
=> img12.png
)

strnatcasecmp

Производит "естественное" сравнение строк без учета регистра.
Синтаксис:

Int strnatcasecmp(string str1, string str2)

То же, что и strnatcmp(), только игнорирует регистр.

similar_text

Производит определение схожести двух строк.
Синтаксис:

Int similar_text(string firsrt, string second [, double percent])

Функция similar_text() вычисляет схожесть двух строк по алгоритму, описанному Оливером (Oliver ).
Но вместо стека (как в псевдокоде Оливера) она использует рекурсивные вызовы.
Сложность алгоритма делает функцию медленной, и ее скорость пропорциональна (N^3), где N - длина наибольшей строки.
Функция возвращает число символов, совпавших в обеих строках. При передаче по ссылке третьего необязательного параметра в нем сохраняется процент совпадения строк.

levenshtein

Определение различия Левенштейна двух строк.
Синтаксис:

Int levenshtein(string str1, string str2)
int levenshtein(string str1, string str2, int cost_ins, int cost_rep, int cost_del)
int levenshtein(string str1, string str2, function cost)

"Различие Левенштейна" - это минимальное чило символов, которое требовалось бы заменить, вставить или удалить для того, чтобы превратить строку str1 в str2. Сложность алгоритма пропорциональна произведению длин строк str1 и str2, что делает функцию более быстродействующей, чем similar_text().

Первая форма функции возвращает число необходимых операций над символами строк для трансформации str1 в str2.

Вторая форма имеет три дополнительных параметра: стоимость операции вставки, замены и удаления, что делает ее более адаптированной для вычисления, но при этом менее быстродействующей. Возвращается интегральный показатель сложности трансформации.
Третий вариант позволяет указать функцию, используемую для расчета сложности трансформации.
Функция cost вызывается со следующими аргументами:

применяемая операция (вставить, изменить, удалить): "I*, "R", "D";

фактический символ первой строки

фактический символ второй строки

позиция строки 1

позиция строки 2

оставшаяся длина строки 1

оставшаяся длина строки 2

Вызываемая функция должна будет возвратить стоимость этой операции.
Если длина одной из строк более 255 символов, функция levenshtein() возвращает -1,
но такая длина более чем достаточна.

strcoll()

Сравнение строк с учетом текущей локали (PHP 4 >= 4.0.5, PHP 5)

Описание:

Int strcoll (string str1, string str2)

Возвращает положительное число если str1 меньше, чем str2; отрицательное число если str1 больше, чем str2, и 0 если строки равны. strcoll() при сравнении использует установки текущей локали. Если установлена локаль C или POSIX, эта функция аналогична strcmp().

Обратите внимание, что эта функция учитывает регистр символов, и, в отличие от strcmp() не безопасна для обработки данных в двоичной форме.

PHP неплохо ориентирован на обработку информации. Синтаксис языка представлен полнофункциональным набором функций сравнения, обработки строк, операторами сравнения.

Любой алгоритм - последовательность выборов и действий. Но прежде чем сделать выбор, нужно что-то сравнить с чем-то. Строки - самый емкий, эффективный и практичный механизм управления алгоритмом. Строки - вариант представления данных. А данные - это главный предмет "заботы" любого алгоритма.

Обычная логика "сравнение-действие"

В общем случае язык не делает особых отличий в данных, например, на PHP сравнение строки и числа мало чем отличается. Число - это тоже строка, когда в ней содержатся только цифры, точка и нет ни одного символа, который не используется для представления числа в любой его форме (математическая нотация).

В случае контенкации число автоматом сливается со строкой без лишних вопросов и никаких скрытых ошибок, даже если функция gettype () дает "integer" или "double".

Однако есть разница между использованием функции is_int () и is_numeric (). Первая дает истину, когда параметр является только целым числом, вторая, когда любым числом или числовой строкой (переменная имеет тип "string", но содержит все, что предусмотрено математической нотацией).

Этот простой пример - хороший образец, как на PHP операторы сравнения строк ("==", "===", "!=", ...) могут подарить множество неожиданностей. Переменные могут менять свой тип, они не всегда числа, но почти всегда их можно привести к строке. В крайнем случае - это будет пустая строка.

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

Границы доступного функционала

PHP-сравнение двух строк хорошо "делает" функция strpos () - самый дешевый, верный и практичный вариант. Если функции число, то однозначно одна строка равна другой или одна входит в другую.

Кардинально противоположный, но тоже абсолютно верный подход - использование регулярных выражений.

Если вызов функции $cResult = scCheckFileName($cStr) даст "true", значит, строка является именем вордовского файла. У него будет только один вариант расширения ".docx" и никаких символов в имени: только буквы, цифры и знаки "_", "-".

Функция легко может быть переделана на другие виды файлов: $cPtr = "/^({4,239})\.(html|js|css|png|jpg|docx|txt){1}$/u". Такой вариант проверки строки расширяет диапазон загружаемых (например, на PHP сравнение строк применено "для загрузки файлов на сервер, без единого шанса на ошибку ввода") на html, js, css, ...

Использование strpos () и preg_match () - крайности. Они не имеют прямого отношения к вопросу сравнения срок. Но ведь вопрос алгоритма - это вопрос применения комбинации стилей, использование всех возможностей для достижения надежного и правильного результата.

Функционал PHP: сравнение строк

Арсенал языка по сравнению строк - это не только функции чистого сравнения, но и сочетание с поиском или заменой непосредственно. Не всегда действие должно совпадать со сравнением, поскольку последнее не обязательно ведет к изменению какой-либо строки. Часто нужно выбрать ту или иную ветку алгоритма.

Обычный вариант PHP: сравнение строк осуществляет функция int strcmp (s1, s2).

Результат функции:

  • 0 - строки равны;
  • -1 - первая строка меньше второй;
  • 1 - первая строка больше второй.

На практике это означает, что входит первая строка во вторую, от чего функция PHP (сравнение строк) принимает решение. Более ограниченный вариант strpos (), поскольку в последнем случае можно знать позицию вхождения.

Функция strcmp () - регистрозависима. Если нужно сравнить строки без учета регистра символов, PHP предлагает воспользоваться strcasecmp(). Синтаксис аналогичен.

На практике часто требуется работать не со всей строкой, а только с ее частью. Для этого в набор функций PHP (сравнение строк) входит strncmp (s1, s2, N). Третий параметр указывает выполнить сравнение только N-байт. Результат аналогичен strcmp ().

Массивы, строки и сравнение

Данные практически всегда представлены строками. Если рассматривать массивы, объекты, или информационные структуры, то это просто различные варианты комбинации более простых строковых структур.

Строковые массивы и строки могут быть представлены взаимодополняющим образом. Трансформация массива в строку функцией implode(array, symbol), например: $margins1 = implode(", ", $style->getInnerMargin()); ... работа алгоритма/пользователя...; $margins2 = implode(", ", $style->getInnerMargin()) позволяет слить все позиции объекта в строку позиций.

Затем можно выполнить PHP-сравнение строк и за один раз: $check = strcmp ($margins1, $margins2) и убедиться, что алгоритм или пользователь что-то изменил (или нет). Если выполнять сравнение обычным образом, то придется перебирать элементы массивов. Это происходит дольше и выглядит более громоздко.

Объекты и строки

Еще более эффектное использование PHP (сравнение строк) может быть реализовано посредством объектно-ориентированных идей.

Современное представление об объектах предполагает наличие у них свойств и методов. Первые обычно представлены числами, строками, массивами и другими объектами. Вторые зачастую включают в себя методы записи (put) в строку и восстановления из строки (get).

В отличие от массивов, объект выполняет работу со своими свойствами и взаимодействует с другими объектами. Объект "компетентен" в том, какие его свойства имеют реальное значение для алгоритма, программы в целом.

Этот момент дает основание и возможность при записи фиксировать в строку только нужную информацию, а при восстановлении из строки восстанавливать все рабочие свойства в нужное состояние. Обычно в любом объекте есть информация существенная и рабочая (временная). Реализация такой идеи позволяет экономить не только память, дисковое пространство, записи базы данных, но и делает возможным сравнение строк более простыми и точными средствами.

Синтаксис и семантика

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

Несомненно, функционал хорош, но его использование можно перенести в смысловую часть кода, в объекты. Когда алгоритм представляется как система взаимодействия объектов, это выглядит значительно лучше, чем последовательность сравнений и действий в прямом последовательном, классическом стиле.