Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Описывание ф-и substr

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
MADONZY
Отправлено: 08 Августа, 2013 - 12:07:44
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Описываю ф-ю substr своими силам без изпользования функций вообще. И тут проблемка, описываю в ф-и substr функцию strlen, но этот strlen выдает NOTICE...ума не приложу как это исправить, хоть и ответ правильный.
П.С: протэстируйте пожалуйста мою описанную ф-ю substr на соответствие оригиналу, буду очень признателен)
Вот код:
PHP:
скопировать код в буфер обмена
  1. function my_substr($var,$from,$qt) {
  2.     function my_strlen($data) { // NOTICE при написании функции my_strlen
  3.         $res = 0;
  4.         for($i=0;$data[$i];$i++) {
  5.             $res++;
  6.         }
  7.         return $res;
  8.     }
  9.     $res = '';
  10.     $vsego = my_strlen($var);
  11.     if($from<=0) {
  12.         $start = $vsego+$from;
  13.         if($qt<=0) {
  14.             for($i=$start;$i<$vsego;$i++) {
  15.                 $res.=$var[$i];
  16.                 if($vsego-$i==1) {
  17.                     for($j=0;$j<-$qt;$j++) {
  18.                         $res.=$var[$j];
  19.                     }
  20.                 }
  21.             }
  22.         } else {
  23.             for($i=$start;$i<$start+$qt;$i++) {
  24.                 $res.=$var[$i];
  25.             }
  26.         }
  27.     } else {
  28.         if($qt<=0) {
  29.             for($i=$from;$i<$vsego;$i++) {
  30.                 $res.=$var[$i];
  31.                 if($vsego-$i==1) {
  32.                     for($j=0;$j<-$qt;$j++) {
  33.                         $res.=$var[$j];
  34.                     }
  35.                 }
  36.             }
  37.         } else {
  38.             for($i=$from;$i<$from+$qt;$i++) {
  39.                 $res.=$var[$i];
  40.             }
  41.         }
  42.     }
  43.     return $res;
  44. }
 
 Top
Мелкий Супермодератор
Отправлено: 08 Августа, 2013 - 12:18:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Вы скажите лучше, почему notice быть не должно? Если вы заведомо обращаетесь к несуществующему элементу строки?


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 08 Августа, 2013 - 12:23:59
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. var_dump(my_substr('datastring', 4), my_substr('datastring', 1, 4));

- как и ожидалось, Fatal error (уверен, догадаетесь сами, почему).
Про множество Notice/Warning в свете ошибки выше говорить не приходится.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
MADONZY
Отправлено: 08 Августа, 2013 - 12:36:44
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Мелкий пишет:
Вы скажите лучше, почему notice быть не должно? Если вы заведомо обращаетесь к несуществующему элементу строки?

Чего именно не существует? Подскажите пожалуйста Улыбка

EuGen пишет:
- как и ожидалось, Fatal error (уверен, догадаетесь сами, почему).

да, догадываюсь:
1) вы не ввели в функцию 3й параметр
2) проблема в функции my_strlen
3) когда я все исправил, то получил на ваш var_dump:
PHP:
скопировать код в буфер обмена
  1. var_dump(my_substr('datastring', 4,1), my_substr('datastring', 1, 4));

такой ответ: string(1) "s" string(4) "atas"
 
 Top
avtor.fox
Отправлено: 08 Августа, 2013 - 12:39:44
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)




MADONZY пишет:
такой ответ: string(1) "s" string(4) "atas"

Лукавите. У EuGen совсем не так.
 
 Top
Мелкий Супермодератор
Отправлено: 08 Августа, 2013 - 12:39:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




MADONZY пишет:
Чего именно не существует?

MADONZY пишет:
for($i=0;$data[$i];$i++) {

При любой длине строки настанет та позиция, в которой $data[$i] не существует. Обращение к несуществующему элементу генерирует E_NOTICE


-----
PostgreSQL DBA
 
 Top
Okula
Отправлено: 08 Августа, 2013 - 12:42:44
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Нужно добавить проверку на существование эллемента в массиве.
 
 Top
MADONZY
Отправлено: 08 Августа, 2013 - 12:52:36
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




avtor.fox пишет:
Лукавите. У EuGen совсем не так.

Вовсе нет, я убрал свою my_strlen и воспользовался встроенным strlen, после этого добавил в запрос EuGen-a var_dump 3й параметр в функцию my_substr и мне вывел такой результат...

Мелкий пишет:
При любой длине строки настанет та позиция, в которой $data[$i] не существует.

Так я и добивался того что-бы цикл дошёл до тех пор, пока у $data не закончатся символы. Но как видите, не получается(( Подскажите пожалуйста что следует исправить? Закатив глазки
Вся ошибка в неправильности ф-и my_strlen, когда её исправим, то все пойдет как по маслу)

(Отредактировано автором: 08 Августа, 2013 - 12:54:37)

 
 Top
Мелкий Супермодератор
Отправлено: 08 Августа, 2013 - 13:12:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




MADONZY пишет:
Так я и добивался того что-бы цикл дошёл до тех пор, пока у $data не закончатся символы

А проверяете значение символа в этой позиции. Значение, а не существование символа.

isset ещё не встречали?
Кстати, по этой же причине получите неожиданный результат в строке 'it has 0 elements'.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 08 Августа, 2013 - 13:16:33
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




MADONZY
Подсказка по поводу Fatal error - Вы определяете функцию внутри функции, стало быть, если Вашу основную функцию вызвать дважды, произойдёт объявление уже определённой функции. Исправить можно, вынеся объявление одной функции за пределы другой, что я и сделал, чтобы протестировать Вашу функцию.
Как я тестировал - пример:
PHP:
скопировать код в буфер обмена
  1. $sData    = 'sdkljfh2b3jk wked k234j sfk nbdffghlk yulkw ';
  2. $iStart   = -2*strlen($sData);
  3. $iEnd     = 2*strlen($sData);
  4. $rgErrors = [];
  5. for($iOffset=$iStart; $iOffset<$iEnd; $iOffset++)
  6. {
  7.    for($iCount=$iStart;$iCount<$iEnd;$iCount++)
  8.    {
  9.       if(substr($sData, $iOffset, $iCount)!=my_substr($sData, $iOffset, $iCount))
  10.       {
  11.          $rgErrors[]=['offset'=>$iOffset, 'count'=>$iCount];
  12.       }
  13.    }
  14. }
  15. echo('Count of mismatches: '.count($rgErrors).PHP_EOL);
  16. echo('Total tests failed: '.round(100*count($rgErrors)/pow($iEnd-$iStart-1, 2), 2).'%'.PHP_EOL);

- на выходе, если бы Ваша функция работала полностью идентично оригинальной substr, я бы получил 0 ошибок и 100%-й результат (то есть 0% ошибок), но я получил
CODE (htmlphp):
скопировать код в буфер обмена
  1. Count of mismatches: 14671
  2. Total tests failed: 47.91%


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
MADONZY
Отправлено: 08 Августа, 2013 - 13:43:16
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Мелкий пишет:
isset ещё не встречали?

Мелкий, по-правде говоря, я почему-то думал что это ф-я, а не языковая конструкция, поэтому не видел смысла в её использовании, так как поставил задачу написать всё без функций) Спасибо, благодаря Вам я залез в мануал что-бы освежить память Улыбка
Вот работающий код (по моему мнению), осталось только что-бы вы его протестировали)
PHP:
скопировать код в буфер обмена
  1. function my_substr($var,$from=0,$qt=1) {
  2.     $res = '';
  3.     $vsego = 0;
  4.     for($i=0;isset($var[$vsego]);$i++) {
  5.         $vsego++;
  6.     }
  7.     if($vsego>0 && $from+$qt<=$vsego) {
  8.         if($from<0) {
  9.             $start = $vsego+$from;
  10.             if($qt<0) {
  11.                 for($i=$start;$i<$vsego;$i++) {
  12.                     $res.=$var[$i];
  13.                     if($vsego-$i==1) {
  14.                         for($j=0;$j<-$qt;$j++) {
  15.                             $res.=$var[$j];
  16.                         }
  17.                     }
  18.                 }
  19.             } else {
  20.                 for($i=$start;$i<$start+$qt;$i++) {
  21.                     $res.=$var[$i];
  22.                 }
  23.             }
  24.         } else {
  25.             if($qt<0) {
  26.                 for($i=$from;$i<$vsego;$i++) {
  27.                     $res.=$var[$i];
  28.                     if($vsego-$i==1) {
  29.                         for($j=0;$j<-$qt;$j++) {
  30.                             $res.=$var[$j];
  31.                         }
  32.                     }
  33.                 }
  34.             } else {
  35.                 for($i=$from;$i<$from+$qt;$i++) {
  36.                     $res.=$var[$i];
  37.                 }
  38.             }
  39.         }
  40.     } else return false;
  41.    
  42.     return $res;
  43. }


EuGen, можете проверять на var_dump, все работает)
(Добавление)
EuGen, да, согласен! Они не одинаковы! Но моя ф-я умеет брать символы от КОНЦА до НАЧАЛА строки вводя 3й параметр отрицательным. Как ни как, я только учусь)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB