У меня есть небольшая проблема с функцией, которая, похоже, не полностью работает в новой версии php, и я получаю
Примечание. Смещение смещения строки произошло в D:\xampp\htdocs\decode\bencoded.php в строке 266
Примечание. Смещение смещения строки произошло в D:\xampp\htdocs\decode\bencoded.php в строке 270
Вот моя функция:
function bdecode($s, &$pos=0) {
if($pos>=strlen($s)) {
return null;
}
switch($s[$pos]){
case 'd':
$pos++;
$retval=array();
while ($s[$pos]!='e'){
$key=bdecode($s, $pos);
$val=bdecode($s, $pos);
if ($key===null || $val===null)
break;
$retval[$key]=$val;
}
$retval["isDct"]=true;
$pos++;
return $retval;
case 'l':
$pos++;
$retval=array();
while ($s[$pos]!='e'){
$val=bdecode($s, $pos);
if ($val===null)
break;
$retval[]=$val;
}
$pos++;
return $retval;
case 'i':
$pos++;
$digits=strpos($s, 'e', $pos)-$pos;
// Proger_XP: changed (int) -> (float) to avoid trimming of values exceeding
// signed int max value (2147483647).
$val=(float)substr($s, $pos, $digits);
$pos+=$digits+1;
return $val;
// case "0": case "1": case "2": case "3": case "4":
// case "5": case "6": case "7": case "8": case "9":
default:
$digits=strpos($s, ':', $pos)-$pos;
if ($digits<0 || $digits >20)
return null;
$len=(float)substr($s, $pos, $digits);
$pos+=$digits+1;
$str=substr($s, $pos, $len);
$pos+=$len;
//echo "pos: $pos str: [$str] len: $len digits: $digits\n";
return (string)$str;
}
return null;
}
Я понимаю, что я получаю предупреждение в новом php, но я понятия не имею, как его исправить.
строка 266 (до случая 'd'): переключатель ($ s [$ pos]) {
строка 270 (после случая "1"): while ($ s [$ pos]! = 'e') {
я думаю, что самым простым решением для решения этой проблемы должно быть отключить уведомления, используя следующий код:
// Report all errors except E_NOTICE
error_reporting(E_ALL ^ E_NOTICE);
Вы можете сделать это, если вы уверены, что код всегда возвращает правильный результат, и уведомление не имеет значения.
Почему уведомление отображается?
Насколько я вижу, уведомление отображается, потому что вы пытаетесь получить доступ к строкам, смещенным не целым числом, а значением поплавка.
Ключевыми строками вашего кода являются следующие:
$len=(float)substr($s, $pos, $digits);
$pos+=$digits+1;
$str=substr($s, $pos, $len);
$pos+=$len;
$len
вызывается для float и добавляется к $pos
. Результат состоит в том, что $pos
преобразуется в float после этого. Нет проблем. Но вы получите уведомление, если позже вы используете $pos
для доступа к смещению вашей строки, потому что это больше не целое число:
//line 266 (before case 'd'):
switch($s[$pos]){
//line 270 (after case '1'):
while ($s[$pos]!='e'){
возможно, вы хотите решить его, переведя $pos
в int explecit следующим образом:
//line 266 (before case 'd'):
switch($s[(int)$pos]){
//line 270 (after case '1'):
while ($s[(int)$pos]!='e'){
Результат вашей функции должен быть одинаковым, и уведомление должно исчезнуть.