За последние 24 часа нас посетили 15626 программистов и 1552 робота. Сейчас ищут 890 программистов ...

Почему выскакивает Notice?

Тема в разделе "PHP для новичков", создана пользователем rudenkov, 9 окт 2011.

  1. rudenkov

    rudenkov Активный пользователь

    С нами с:
    9 окт 2011
    Сообщения:
    20
    Симпатии:
    0
    Адрес:
    Minsk
    Написал аналог функции strlen(), функция работает но вылазит нотис, не могу понять в чем дело.

    PHP:
    1. <?php
    2.     function mylen($var){
    3.         $i = 0;
    4.         while(!$var{$i} == ''){
    5.             $i++;
    6.         }
    7.         return $i;
    8.     }
    9.     echo mylen('1234');// 4 and Notice: Uninitialized string offset: 4 in...
    10. ?>
     
  2. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Потому-что обращаешься к 5-му элементу строки (4-й если считать с нуля), которого нет.
     
  3. rudenkov

    rudenkov Активный пользователь

    С нами с:
    9 окт 2011
    Сообщения:
    20
    Симпатии:
    0
    Адрес:
    Minsk
    А как по другому можно реализовать функцию для вычисления длинны строки?
     
  4. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    while(!$var{$i} == ''){

    заменить на

    while(isset($var[$i])){
     
  5. rudenkov

    rudenkov Активный пользователь

    С нами с:
    9 окт 2011
    Сообщения:
    20
    Симпатии:
    0
    Адрес:
    Minsk
    Спасибо!
     
  6. rudenkov

    rudenkov Активный пользователь

    С нами с:
    9 окт 2011
    Сообщения:
    20
    Симпатии:
    0
    Адрес:
    Minsk
    Вопрос опять по этой же теме. Нужно написать функцию которая будет конвертировать число из двоичной в десятичную систему. При этом нельзя использовать встроенные функции PHP.

    1. Для вычисления длинны строки нельзя использовать isset, применял проверку на NULL, при этом обращаясь к несуществующему элементу строки получал нотис в 14 и 16 строках (Notice: Uninitialized string offset: 4 in...). Возможно ли по другому посчитать размер строки?
    2. Какие есть замечения по коду. В каких местах можно его оптимизировать.
    3. При написании кода испытывал некоторые трудности при использвании постфиксного инкремента\декремента, проблему решил использованием префиксного инкремента\декремента. Имеет ли значение какой инкремент\декремент использовать в цикле:
    PHP:
    1. <?for(;;$i++ or ++$i)?>
    PHP:
    1. <?php
    2.     function binTOdec($n){
    3.         if($n == 0){
    4.             return 0;
    5.             break;
    6.         }
    7.         if($n == 1){
    8.             return 1;
    9.             break;
    10.         }
    11.         $s = "$n";
    12.         $i = 0;
    13.         $sum = 0;
    14.         while($s{$i} != NULL and ($s{$i} == 0 or $s{$i} == 1))// Считает длинну числа
    15.             ++$i;
    16.         if($i != 0 and $s{$i} == NULL){ // Проверка  систем счисления введеного числа
    17.             --$i;
    18.             for($k=0;$k<$i;++$k){ // Перебо всех элементов строки, за исключением последнего
    19.                 $pr = 1;
    20.                 for($b=$i-$k;$b>0;++$b){ // Возводим 2 в степень
    21.                     $pr = $pr * $s{$k} * 2;
    22.                 }
    23.                 $sum = $sum + $pr; // Сумма произведений двойки
    24.                 $pr = 1;
    25.             }
    26.             if($s{$i} == 0) // Проверка последнего символа строки, который возводится в нулевую степень
    27.                 return $sum;
    28.             else
    29.                 return $sum+1;
    30.         }
    31.         else
    32.             return 'Вы ввели неверное число!';
    33.     }
    34.     echo binTOdec(1101);
    35. ?>
     
  7. krow7

    krow7 Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    из Азии
    PHP:
    1. <?php
    2. function power($base, $power)
    3. {
    4.     if($power===0)
    5.     {
    6.         return 1;
    7.     }
    8.     if($power===1)
    9.     {
    10.         return $base;
    11.     }
    12.     else
    13.     {
    14.         return (power($base, $power-1))*($base);
    15.     }
    16. }
    17. function bin2decimal($str)
    18. {
    19.     $len=strlen($str);
    20.     $ret=0;
    21.     for($i=$len-1; $i > -1; $i--)
    22.     {
    23.         if($str[$i]==='1')
    24.         {
    25.             $ret+=(power(2,($len-$i-1)));
    26.         }
    27.     }
    28.     return $ret;
    29. }
    30. $str='100000';
    31. echo bin2decimal($str); // 32 вернет
     
  8. rudenkov

    rudenkov Активный пользователь

    С нами с:
    9 окт 2011
    Сообщения:
    20
    Симпатии:
    0
    Адрес:
    Minsk
    В 14 строке я так понимаю это рекурсия, которая умножает двойку, а выход из рекурсии осуществляется если приходит 0, не совсем понимаю как она работает. strlen() использовать нельзя. не предусмотрено то что будет введена цифра не равная 0 или 1.
     
  9. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    rudenkov
    напоминает школьное задание. а твоя функция работает?
    запрет использования isset - это тупость, т.к. это больше оператор языка, чем функция.
    может в задании сказано подсчитать длину строки вообще не используя php ?

    а для подавления вывода ошибок можно использовать собачку.
     
  10. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    PHP:
    1.  
    2. <?php
    3. $str = 10000000;
    4. $length = exec('#!/bin/bash
    5.        str='.$str.'
    6.        echo ${#str}');
    [​IMG]
     
  11. rudenkov

    rudenkov Активный пользователь

    С нами с:
    9 окт 2011
    Сообщения:
    20
    Симпатии:
    0
    Адрес:
    Minsk
    Собственно и раздел для новичков ) Да функция работает.
    Собачка лишь скрывает ошибки, но не исправляет их.
     
  12. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    собачка скрывает вывод об ошибке при обращении к несуществующему эл-ту строки/массива.
    а уж проверять элемент ты должен в коде. не знаю как ещё можно вычислить длину строки
    не используя встроенных функций, если даже конструкции isset/empty запрещёны