[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Зациклилась рекурсия
Страницы: 1, 2
Sladkiy
Здравствуйте, уважаемые знатоки!
Хочу написать функцию типа strlen(), да чё-то рекурсия не поддаётся =\

 
function myStrlen($str){
if($str===true) return 1;
if(is_array($str)) return 0; //Здесь бы какую-нибудь ошибку инициализировать типа Warning ... как сделать?
$str=(string)$str;
static $cnt=0;
if (!is_null($str{$cnt})) { //Проверка на конец строки. Может неправильное условие?
$cnt++;
myStrlen($str);
}
else return $cnt;
}

Понятно, что можно и без рекурсии гораздо легче:

for($cnt=0; $str{$cnt}; $cnt++);
return $cnt;

Но всё же, почему бесконечная рекурсия получается?
inpost
Зачем? Пользуйся готовой и всё.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Sladkiy
Это спасибо за совет, конечно я готовой буду пользоваться, ибо она быстрее. Я тут практикуюсь... Вот никак не могу понять, где ошибка в моей небольшой ф-ии. =\
Может ещё подскажете, как проинитить Варнинг подобный тому, который выкидывает strlen от массива?
inpost
У тебя точно win1251 ? Потому что данная функция не будет работать с utf-8. Строка не является массивом символов, в отличии от JavaScript. В этом и проблема.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Sladkiy
Дык, я же делаю проверку на массив.
if(is_array($str)) return 0;

а дальше ф-я работает только со строкой
inpost
Ты не ответил про кодировку.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Sladkiy
Не могу сейчас сказать какая кодировка, не за той машиной сижу. А что, в моём коде что-то от кодировки может зависеть?
inpost
Перечитай предыдущий мой коммент. Там я сказал же ответ уже.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Sladkiy
Цитата (inpost @ 24.12.2012 - 23:35)
У тебя точно win1251 ? Потому что данная функция не будет работать с utf-8. Строка не является массивом символов, в отличии от JavaScript. В этом и проблема.

ок
1) Можешь объяснить, почему моя функция не будет работать, если кодировка utf-8?
2) А где я в функции работаю со строкой как с массивом символов?
3) И почему же у меня рекурсия бесконечной получается?
inpost
$str{$cnt} - на что ты тут ссылаешься? На байт, а ЮТФ - многобайтный.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
xlebosol
Да я так понимаю что условие [if($str===true) return 1;)] будет истинно всегда.
Sladkiy
Цитата (xlebosol @ 25.12.2012 - 00:05)
Да я так понимаю что условие  [if($str===true) return 1;)] будет истинно всегда.

Нене, это if($str==true) return 1;) будет всегда истинно, ну если там хоть что-то есть
xlebosol
Так правильно, а что сделано, чтобы там ничего не было. $str=(string)$str; замени на $str = substr($str,0,-1); и проверь данные var_dump();
Sladkiy
Цитата (inpost @ 25.12.2012 - 00:01)
$str{$cnt} - на что ты тут ссылаешься? На байт, а ЮТФ - многобайтный.

А как тогда обращаться к отдельным символам в строке?
Invis1ble
оффтоп
ТС, ты не семён случайно? Попахивает виртуалом (http://phpforum.ru/index.php?showtopic=69569) smile.gif


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.