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
Форумы портала PHP.SU :: Версия для печати :: Рекурсивная функция. Ошибка реализации?!
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Рекурсивная функция. Ошибка реализации?!

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

1. Scorp24 - 22 Января, 2012 - 16:13:24 - перейти к сообщению
Доброго времени суток!

Класс, реализует проверку на соблюдение правил ввода символов:

CODE (htmlphp):
скопировать код в буфер обмена
  1. class Check
  2. {
  3.     // функция заносит фрагменты строк в массив, для их дальнейшей проверки
  4.     public function subToArr($chars)
  5.     {
  6.         while (условие) {
  7.             $chars = $substr;
  8.             $arr_substr[] = $substr;
  9.         }    
  10.         foreach($arr_substr as $val) {
  11.             subToArr($val); // собственно line 89
  12.         }
  13.     }
  14.  
  15. }


Ошибка следующая:

Fatal error: Call to undefined function subtoarr() in Z:\home\localhost\www\task\Class.php on line 89

В чем ошибка, подскажите, плз?!
2. OrmaJever - 22 Января, 2012 - 16:45:29 - перейти к сообщению
Ну subToArr() это не функция, а метод который должен вызывается из обьекта
3. Scorp24 - 22 Января, 2012 - 16:52:58 - перейти к сообщению
OrmaJever пишет:
Ну subToArr() это не функция, а метод который должен вызывается из обьекта


CODE (htmlphp):
скопировать код в буфер обмена
  1. class Check
  2.     {
  3.         // функция заносит фрагменты строк в массив, для их дальнейшей проверки
  4.         public function subToArr($chars)
  5.         {
  6.            function countChars($chars) //забыл упомянуть про этот метод и собственно line 13
  7.            {
  8.                возвращает true или false;
  9.            }
  10.            while (countChars($chars) == true) {
  11.                 $chars = $substr;
  12.                 $arr_substr[] = $substr;
  13.             }    
  14.             foreach($arr_substr as $val) {
  15.                 $this->subToArr($val); // исправил (ранее пробовал)
  16.             }
  17.         }
  18.      
  19.     }


теперь такая ошибка:

Fatal error: Cannot redeclare countchars() (previously declared in Z:\home\localhost\www\task\Class.php:13) in Z:\home\localhost\www\task\Class.php on line 13
4. OrmaJever - 22 Января, 2012 - 16:58:56 - перейти к сообщению
почему эта функци определяется внутри метода? Вынесите её отдельным методом и обращайтесь через $this->countchars()
5. Scorp24 - 22 Января, 2012 - 17:04:13 - перейти к сообщению
OrmaJever пишет:
почему эта функци определяется внутри метода? Вынесите её отдельным методом и обращайтесь через $this->countchars()


Делал и так, но появляется другая ошибка:

Warning: Invalid argument supplied for foreach() in Z:\home\localhost\www\task\Class.php on line 89

CODE (htmlphp):
скопировать код в буфер обмена
  1.     class Check
  2.         {
  3.             // функция заносит фрагменты строк в массив, для их дальнейшей проверки
  4.             public function subToArr($chars)
  5.             {
  6.                while ($this->countChars($chars) == true) {
  7.                     $chars = $substr;
  8.                     $arr_substr[] = $substr;
  9.                 }    
  10.                 foreach($arr_substr as $val) { // line 89
  11.                     $this->subToArr($val);
  12.                 }
  13.             }
  14.          
  15.         }
6. OrmaJever - 22 Января, 2012 - 17:13:22 - перейти к сообщению
Так, я вгледелся в код и понял что это беда.
1) Если $this->countChars($chars) вернёт true то цыкл будет бесконечный, скорее всего тут нужно условие
2) Масив $arr_substr, нужно внчале метода обьявить ($arr_substr = array()), это нужно для того что-бы небыло notice, и для цыкла foreach
7. Scorp24 - 22 Января, 2012 - 17:30:54 - перейти к сообщению
OrmaJever пишет:
Так, я вгледелся в код и понял что это беда.
1) Если $this->countChars($chars) вернёт true то цыкл будет бесконечный, скорее всего тут нужно условие
2) Масив $arr_substr, нужно внчале метода обьявить ($arr_substr = array()), это нужно для того что-бы небыло notice, и для цыкла foreach


Искренне благодарен!
Разобрался, ответ в пункте 2, необходимо было массив объявить в начале метода.

 

Powered by ExBB FM 1.0 RC1