Почему этот вызов strstr не возвращает false?

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

$value = 2660;
$link = 'affiliateid=1449&zoneid=6011&placement_id=11736&publisher_id=1449&period_preset=yesterday&period_start=2017-03-27&period_end=2017-03-27';

var_dump(strstr($link, $value));

Я ожидаю, что это вернет false, так как "2660" не находится в строке, но возвращает d=1449&zoneid=6011&placement_id=11736&publisher_id=1449&period_preset=yesterday&period_start=2017-03-27&period_end=2017-03-27.

Я понимаю, что $value должен быть строкой, но все же я не понимаю, почему он не был добавлен в строку PHP и почему он находит этот номер в ссылке.

Собственно, если я пытаюсь с $value = '2660';, он возвращает false, как ожидалось.

Любая идея, что происходит?

Ответы

Ответ 1

Короткий ответ

Когда вы выполняете strstr($str, 2660), $needle разрешается символу " d", вызывая chr(2660), и поэтому он останавливается при первом " d найденный в данном $str, в этом случае справа на 11-м символе.

<ч/" >

Почему мы вызываем chr(2660)?

Потому что, когда $needle не является строкой strstr, этот аргумент отличает целое число и использует соответствующий символ для этой позиции из расширенный код ASCII, где chr(2660) - d".

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


Но почему chr(2660) возвращает " d", когда " d" ord(100)?

Поскольку значения за пределами допустимого диапазона [0-255] будут побитовыми и имеют значение 255, что эквивалентно следующему алгоритму [ источник]

while ($ascii < 0) {
    $ascii += 256;
}
$ascii %= 256;

Итак, 2660 становится 100, а затем, когда он передан в strstr, он используется как порядковое значение символа и ищет символ " d".

Непонятный? Да. Я также ожидал, что он будет передан в строку, но это то, что мы получаем за то, что принимаем участие в программировании. Это, по крайней мере, документировано; вы были бы удивлены, сколько раз случалось что-то странное и нет официального объяснения. По крайней мере, не так легко, как после той же самой ссылки, которую вы предоставили.

<ч/" >

Почему это называется strstr?

Я немного поработал и нашел этот камень (Обоснование для Американский национальный стандарт     для информационных систем -     Язык программирования - C) со всего 1989 года, где они назвали все функции, относящиеся к строкам, с префиксом str, который является логическим, тогда, поскольку источник PHP написан на C, он объяснит, почему он перенес. Лучше всего предположить, что мы ищем str внутри другого str, они говорят:

Функция strstr является изобретением Комитета. Он включен как крючок для эффективных алгоритмов подстроки или для встроенных подстроки.

Полезные документы

  • Документация для strstr
  • Документация для chr
  • PHPwtf хороший ресурс для странности

Ответ 2

Я думаю, что это отвечает на ваш вопрос:

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

http://php.net/manual/en/function.strstr.php

Изменить из-за комментариев:

chr(2660) возвращает символ d, который действительно находится в стоге сена, и почему он не вернет false, как вы ожидали.