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 :: Не правильно работает рекурсивная функция

 PHP.SU

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


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

> Описание: Не правильно работает рекурсивная функция
3d_killer
Отправлено: 13 Февраля, 2014 - 13:54:01
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




в классе создана рекурсивная функция:
PHP:
скопировать код в буфер обмена
  1.  
  2. private function all_category($id,$index)
  3.         {
  4.                 global $DBH;
  5.                 global $index;
  6.                 $id_category = $DBH->prepare("SELECT id,name FROM table_catalog WHERE parent=:parent");
  7.                 $id_category->bindParam(':parent',$id);
  8.                 $id_category->execute();
  9.                 if($id_category->rowcount()>0)
  10.                         while($res=$id_category->fetch())
  11.                                 {
  12.                                         $this->all_category[$index]=$res['id'];
  13.                                         $this->all_category($res['id'],$index);
  14.                                         $index++;
  15.                                 }
  16.         }
  17.  

вызываю так:

все бы хорошо, да только первый элемент не 0 а пустое значение:
CODE (htmlphp):
скопировать код в буфер обмена
  1. array(23) { [""]=> string(1) "2" [1]=> string(1) "3" [3]=> string(1) "5" [4]

функцию в некоторых случаях нужно вызывать и с другим значением $index

помогите найти ошибку

(Отредактировано автором: 13 Февраля, 2014 - 13:55:39)

 
My status
 Top
DelphinPRO
Отправлено: 13 Февраля, 2014 - 14:09:40
Post Id



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


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


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




рекурсивные запросы в БД? Сударь знает толк в извращениях. Улыбка

вытаскивайте все записи одним запросом, потом стройте дерево.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
IllusionMH
Отправлено: 13 Февраля, 2014 - 14:09:44
Post Id



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


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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





Не понял
PHP:
скопировать код в буфер обмена
  1. $this->all_category[$index]=$res['id'];
  2. $this->all_category($res['id'],$index);
 
 Top
Мелкий Супермодератор
Отправлено: 13 Февраля, 2014 - 14:10:27
Post Id



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


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


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




Я аккуратно намекну:
PHP:
скопировать код в буфер обмена
  1. class foo {
  2. function test($index)
  3.         {
  4.   global $index;
  5. var_dump($index);
  6. }
  7. }
  8.  
  9. $index = 2;
  10. $r = new foo;
  11. $r->test(1);


Что значит: НИКОГДА не используйте глобальные переменные.


-----
PostgreSQL DBA
 
 Top
3d_killer
Отправлено: 13 Февраля, 2014 - 14:16:42
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




переменную убрал:
PHP:
скопировать код в буфер обмена
  1.  
  2. private function all_category($id,$index)
  3. {
  4.         global $DBH;
  5.         $id_category = $DBH->prepare("SELECT id,name FROM table_catalog WHERE parent=:parent");
  6.         $id_category->bindParam(':parent',$id);
  7.         $id_category->execute();
  8.         if($id_category->rowcount()>0)
  9.                 {
  10.                         while($res=$id_category->fetch())
  11.                                 {
  12.                                         $this->all_category[$index]=$res['id'];
  13.                                         $index++;
  14.                                         $this->all_category($res['id'],$index);
  15.                                 }
  16.                 }
  17. }
  18.  

второй уровень не вытаскивает почему то

DelphinPRO пишет:
рекурсивные запросы в БД? Сударь знает толк в извращениях. Улыбка

вытаскивайте все записи одним запросом, потом стройте дерево.

а если записей миллионы, а я знаю что запросов будет не более 3-5 и содержать они будут около 10 значений, что будет тогда выгоднее по ресурсам?


IllusionMH пишет:

Не понял

1 - переменная
2 - метод
 
My status
 Top
IllusionMH
Отправлено: 13 Февраля, 2014 - 14:20:45
Post Id



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


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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





3d_killer, я знаю, но это просто ппц как удобно. Неужели нельзя свойство сделать во множественном числе, и более наглядно отличать свойство от метода?

(Отредактировано автором: 13 Февраля, 2014 - 14:20:57)

 
 Top
DelphinPRO
Отправлено: 13 Февраля, 2014 - 14:22:01
Post Id



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


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


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




3d_killer пишет:
а если записей миллионы, а я знаю что запросов будет не более 3-5 и содержать они будут около 10 значений, что будет тогда выгоднее по ресурсам?
Что-то я не вижу в вашем коде ограничений на выборку Улыбка вытаскивается вся ветка с определенного уровня.
(Добавление)

IllusionMH пишет:
Неужели нельзя свойство сделать во множественном числе, и более наглядно отличать свойство от метода?
Свойства - имена существительные, методы - глаголы. Хорошее правило. ;)


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
3d_killer
Отправлено: 13 Февраля, 2014 - 14:30:44
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




я не стал полный запрос тут писать чтобы не загромождать (так запрос несколько строк)
 
My status
 Top
teddy
Отправлено: 13 Февраля, 2014 - 14:34:27
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


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




Я долго курил зачем нужно так делать, но так и не понял... Можно просто сделать

PHP:
скопировать код в буфер обмена
  1. private function getCategoryOnParent($parent){
  2.    
  3.     $stmt = $this->_dbh->prepare("SELECT `id`, `name` FROM `table_catalog` WHERE `parent`=:parent");
  4.     $stmt->execute(array(':parent' => $parent));
  5.     $row = $stmt->fetchAll();
  6.     return count($row) != 0 ? $row : false;
  7.  
  8. }

По поводу быстродействия выборки для таблиц с большим количеством записей: для этого были придуманы индексы. Это отличный способ позволить БД уйти от тупого перебора всех записей пока он не встретит нужную.

(Отредактировано автором: 13 Февраля, 2014 - 14:34:55)

 
 Top
IllusionMH
Отправлено: 13 Февраля, 2014 - 14:44:44
Post Id



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


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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




teddy, как всегда на своей волне...
Тут дерево строят, а не кол-во элементов считают.

3d_killer, какие данные передаются во второй вызов смотрели?


DelphinPRO, ага, только я выше такого не заметил.
 
 Top
3d_killer
Отправлено: 13 Февраля, 2014 - 14:51:23
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




в запросе который я привел вторым. я просматривал что как идет
получилось что второй вызов забивает нужные данные но первый их затирает так как index для него то не менялся в процессе выполнения рекурсии.
То есть необходимо все таки использовать глобальную переменную, но в случае с ней первый элемент массива не 0 а пусто, как приведено в первом посте
 
My status
 Top
teddy
Отправлено: 13 Февраля, 2014 - 14:55:34
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


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




IllusionMH
Ну я понял что ему нужно выбрать категории и их подкатегории. Это можно сделать одним запросом используя группировку и вернуть результат как я написал выше.
IllusionMH пишет:
Тут дерево строят, а не кол-во элементов считают.

Мой пример не считает количество, а возвращает все записи, которые соответствуют условию выборки. Если результата нет, то вернется false.

(Отредактировано автором: 13 Февраля, 2014 - 14:56:34)

 
 Top
3d_killer
Отправлено: 13 Февраля, 2014 - 14:59:10
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




IllusionMH пишет:
DelphinPRO, ага, только я выше такого не заметил.

ну конечно не заметили, так как я "играюсь" с тестовой базой. Каталог из 1С загружу потом
 
My status
 Top
IllusionMH
Отправлено: 13 Февраля, 2014 - 15:10:33
Post Id



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


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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




3d_killer, и как каталог 1С влияет на адекватыне названия методов и свойств?

teddy, ок, завтыкал.
 
 Top
3d_killer
Отправлено: 13 Февраля, 2014 - 15:11:59
Post Id



Участник


Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011  
Откуда: Ростов-на-Дону


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




все заработал, всем спасибо:
PHP:
скопировать код в буфер обмена
  1.  
  2. private function all_category($id,$index)
  3. {
  4.         global $DBH;
  5.         $id_category = $DBH->prepare("SELECT id,name FROM table_catalog WHERE parent=:parent");
  6.         $id_category->bindParam(':parent',$id);
  7.         $id_category->execute();
  8.         if($id_category->rowcount()>0)
  9.                 {
  10.                         while($res=$id_category->fetch())
  11.                         {
  12.                         $this->all_category[$index]=$res['id'];
  13.                         $index++;
  14.                         $index=$this->all_category($res['id'],$index);
  15.                         }
  16.                 }
  17.         return $index;
  18. }

(Добавление)
IllusionMH пишет:
3d_killer, и как каталог 1С влияет на адекватыне названия методов и свойств?

про адекватные названия полностью согласен, я про количество элементов в массиве представленном
 
My status
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB