Написал аналог функции strlen(), функция работает но вылазит нотис, не могу понять в чем дело. PHP: <?php function mylen($var){ $i = 0; while(!$var{$i} == ''){ $i++; } return $i; } echo mylen('1234');// 4 and Notice: Uninitialized string offset: 4 in... ?>
Вопрос опять по этой же теме. Нужно написать функцию которая будет конвертировать число из двоичной в десятичную систему. При этом нельзя использовать встроенные функции PHP. 1. Для вычисления длинны строки нельзя использовать isset, применял проверку на NULL, при этом обращаясь к несуществующему элементу строки получал нотис в 14 и 16 строках (Notice: Uninitialized string offset: 4 in...). Возможно ли по другому посчитать размер строки? 2. Какие есть замечения по коду. В каких местах можно его оптимизировать. 3. При написании кода испытывал некоторые трудности при использвании постфиксного инкремента\декремента, проблему решил использованием префиксного инкремента\декремента. Имеет ли значение какой инкремент\декремент использовать в цикле: PHP: <?for(;;$i++ or ++$i)?> PHP: <?php function binTOdec($n){ if($n == 0){ return 0; break; } if($n == 1){ return 1; break; } $s = "$n"; $i = 0; $sum = 0; while($s{$i} != NULL and ($s{$i} == 0 or $s{$i} == 1))// Считает длинну числа ++$i; if($i != 0 and $s{$i} == NULL){ // Проверка систем счисления введеного числа --$i; for($k=0;$k<$i;++$k){ // Перебо всех элементов строки, за исключением последнего $pr = 1; for($b=$i-$k;$b>0;++$b){ // Возводим 2 в степень $pr = $pr * $s{$k} * 2; } $sum = $sum + $pr; // Сумма произведений двойки $pr = 1; } if($s{$i} == 0) // Проверка последнего символа строки, который возводится в нулевую степень return $sum; else return $sum+1; } else return 'Вы ввели неверное число!'; } echo binTOdec(1101); ?>
PHP: <?php function power($base, $power) { if($power===0) { return 1; } if($power===1) { return $base; } else { return (power($base, $power-1))*($base); } } function bin2decimal($str) { $len=strlen($str); $ret=0; for($i=$len-1; $i > -1; $i--) { if($str[$i]==='1') { $ret+=(power(2,($len-$i-1))); } } return $ret; } $str='100000'; echo bin2decimal($str); // 32 вернет
В 14 строке я так понимаю это рекурсия, которая умножает двойку, а выход из рекурсии осуществляется если приходит 0, не совсем понимаю как она работает. strlen() использовать нельзя. не предусмотрено то что будет введена цифра не равная 0 или 1.
rudenkov напоминает школьное задание. а твоя функция работает? запрет использования isset - это тупость, т.к. это больше оператор языка, чем функция. может в задании сказано подсчитать длину строки вообще не используя php ? а для подавления вывода ошибок можно использовать собачку.
Собственно и раздел для новичков ) Да функция работает. Собачка лишь скрывает ошибки, но не исправляет их.
собачка скрывает вывод об ошибке при обращении к несуществующему эл-ту строки/массива. а уж проверять элемент ты должен в коде. не знаю как ещё можно вычислить длину строки не используя встроенных функций, если даже конструкции isset/empty запрещёны