Доброго времени суток ! имею код Код (Text): function mystrlen($item) { if(is_null($item)) return 0; if(!is_string($item)) return 0; static $c = 0; $rr = $item{$c}; if(!$rr == 0 ) { $c++; mystrlen($item); }else{ var_dump( $c); return $с; } } $item = 'dfgdfgdfgdfgd'; $val = mystrlen($item); var_dump($val); проблема в том , что в вал функция отдает null я не могу почему до return var_dump отдает количество элементов а ретурн получается отдает нулл хотелось бы понять почему так
у тебя ретёрн делается из элса условия "не рр равно нулю". а более нигде ретёрна не делается. а поскольку результат вызова функции присваивается переменной - пхп записывает void как результат. а поскольку войда в пхп нет - записывается налл.
всегда удивляли программисты, у которых отступ 3 пробела. и вообще здесь с отступами полных ппц. они не соответствуют структуре, только сбивают с толку. это специальный подвох чтобы одурачить читателя?
p@R@dox 55RU, можно [ ] и { } использовать https://php.net/manual/ru/language.types.string.php#languag ... ing.substr
я знаю что можно использовать. Меня заинтересовала эта запись Код (Text): if(!$rr == 0 ) Чтооооо это такоее?
автор, у тебя переменная в return в кириллическом написании! это не ЛатинскаяЦе, а РусскаяЭс ))) это специальный подвох №2 чтобы одурачить читателя? собственно ошибка в том, что финальный ретурн происходит неявно, не там где "ретурн эс", а просто по окончанию функции — т.к. сработал блок иф, а не блок элс. это подвох №3, я считаю. глаз видит оператор возврата и кажется, что именно там всегда происходит выход. на самом деле тот ретурн срабатывает один раз по достижении конца строки. именно поэтому мы видим только один результат вардамп! а неявный выход случается столько раз, сколько символов в строке. Добавлено спустя 7 минут 1 секунду: исправленный вариант функции: Код (PHP): function mystrlen($item) { static $c = 0; if(isset($item{$c})) { $c++; mystrlen($item); } return $c; }
да я прекрасно понимаю что это отрицание... Но это не то место где его использовать в таком виде. Если бы $rr было логическим выражением -вопросов бы не было. А за такого некорректного когда начинаются тормоза и лишние вопросы.
хаха, дык вся это функция, мягко говоря, небыстрая. видимо не было такой цели. это похоже на специально написанный тест на способность видеть ошибки. судя по многообразию косяков. кстати, где-то в теме про беспощадную микрооптимизацию я читал, что isset($str{0}) вероятно самый быстрый способ проверки на непустую строку. edited: объяснение - On PHP function calls
зачем тогда сочинять очередной велосипед, который в результате ваще не работает? есть же strlen - и пользуйся им на здоровье. Лучше бы время на что-то более полезное тратить ))
про идее быстрее будет empty - она к счетчику символов должна будет обратиться а там ноль или не ноль. это к вопросу о том использовать или нет count($array) внутри условия циклов - функция не считает длину массива а сразу возвращает значение внутреннего счетчика. но могу врать ибо давно сурсы зенд-машины читал.
Ganzal Код (Text): $s = '0'; var_dump(empty($s)); // bool(true) поэтому таки isset. хотя есть случаи, когда '0' и '' действительно имеют один и тот же смысл, тогда ок.
всем спасибо ! все работает . нехватало returna вне блоков. смысл этого велосипеда в том что это просто практика набиваю руки уж простите сам учусь - как могу . могу показать реальный код рабочий )
Амир, еще на заметку - вот это Код (PHP): if(is_null($item)) return 0; if(!is_string($item)) return 0; можешь заменить на просто Код (PHP): if(!is_string($item)) return 0; ))) пустое значение не является строкой
это было куда интереснее, и советы услышал бы тоже полезные, как можно было бы правильнее сделать... Мы рады за тебя! Успехов!
Ув Гуру ! следуя вашим замечания немного поправил код. теперь он менее походит на Г_код ? Задача была описать встроенную функцию strlen() своими силами. В голову пришла рекурсия ,но была идея использовать цикл for , проверять с помощью if - стоп цикл с помощью break или ретурн ( он работает если не ошибаюсь тоже как break) почему рекурсия - посчитал ее более подходящей в плане количества кода. буду рад замечаниям ! Код (Text): function mystrlen($item) { if(!is_string($item)) return 0; static $c = 0; if(!$item{$c} == 0 ){ $c++; mystrlen($item); }else{ return $с; } return $c; } $item = 'string'; $val = mystrlen($item); echo $val;
да, наверное count тоже годится. не возьмусь вычислять самый быстрый метод ))) мне достаточно знать просто рабочий. а про быстроту я цитировал с долей сарказма.
amir_Mirov, как упражнение для ума это конечно забавно, но как альтернативный strlen это не годится, сам же понимаешь. надеюсь, что понимаешь ))) чем плох твой нынешний код: - блок else просто лишний - !$item{$c} == 0 это нечитабельно. ну не пишут так люди "не икс равно нулю" ))) - !$item{$c} == 0 вызовет выдачу предупреждения на последнем проходе, см. ниже - static вещь коварная, он ведь сохранит значение! что будет если протестировать сначала '123456', а потом '123' ? вобщем, ты сумел собрать рекордное количество косяков на таком простом примере. браво! Добавлено немного спустя: Всегда отлаживай свои скрипты со включенным выводом предупреждений. А на рабочем сайте выключай! Включается вывод так: Код (PHP): error_reporting(-1); // 0 - выключить, -1 - включить все, другие значения включают какие-то отдельные ошибки ini_set('display_errors', 'on'); Добавлено спустя ещё некоторое время: проверять наличие переменной, или элемент массива, или смещение строки (как у тебя), чтобы при этом не выдавалось предупреждение можно с помощью встроенных функций isset и empty, почитай по ним справку! если быть точным, это даже не функции, а конструкции языка, как if или for поэтому в своем примере я тестировал то же самое через isset.
Спасибо за замечания. не подходит как альтернативный strlen - оригинальная функция написана на с ( скорость ) + зачем писать то что уже написано. блок else - убрал все отработало ! все ок static - учел. (изменил ) error_reporting(-1) вывел увидел В итоге много выводов. и огромное вам человеческое спасибо! след функция. var_dump(); Код (Text): function mystrlen($item,$c=0) { if(!is_string($item)) return 0; if(isset($item{$c})){ $c++; return mystrlen($item,$c); } return $c; } $item = 'strifg'; echo mystrlen($item);
Всё это while'ом можно без проблем подсчитать без статических переменных и рекурсии. Идёте посимвольно по строке и считаете, пока строка не закончится. Зачем так мудрить?
согласен что можно ! можно еще что- нибуть придумать. а можно раскрытый ответ если while то почему кода будит тоже количество while быстрей или просто вам он удобней. хотелось бы фактов - я учусь учтите этот факт . спасибо