«Странности» с типами в PHP

Как известно, язык PHP славится своими «подводными камнями», когда дело касается типизации переменных.

Рассмотрим задачу, когда, казалось бы, очевидное и простое решение вдруг не работает, и очень важно внимательно читать документацию.

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

Запускаем, ожидаем увидеть текст Microsoft — но ничего нет! Как же так, все же просто?! Начинаем читать документацию функции strpos() и находим там следующее: «Если needle [второй параметр функции] не является строкой, он приводится к целому и трактуется как код символа». Ага, все понятно, надо задать ключи в массиве в виде строк, вот так:

Запускаем — и снова ничего! И снова читаем документацию, теперь уже по массивам, и находим там следующее: «Строки, содержащие целое число (исключая случаи, когда число предваряется знаком +) будут преобразованы к типу integer». То есть наше преобразование ключей оказалось бесполезным, они все равно считаются средой PHP целочисленными. В итоге приходится при каждой итерации предварительно преобразовывать ключ массива к строковому типу:

Можно предложить еще один вариант решения задачи — через регулярные выражения:

Мораль сей басни такова: читайте внимательно документацию, там часто поясняются тонкие моменты и «подводные камни».

P.S. Я намеренно немного упростил решение задачи, потому что, например, если есть договоры с номером 12 и 123, то при простом поиске по тексту ‘Договор № 123’ номер легко может определиться как 12, но это уже не относится к теме заметки, это больше о том, что входные данные могут подкидывать любые сюрпризы, нужно всегда быть готовым к ним, всегда держать голову включенной. В данном случае мы могли бы переписать наш поиск так:

То есть мы ищем в тексте подстроку с номером договора, и требуем, чтоб после этой подстроки не шла цифра.

Добавить комментарий