PHP.SU

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


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

> Описание: Мой вечерний мозг отказывается это понимать
Самогонщик
Отправлено: 08 Января, 2012 - 20:33:11
Post Id



Посетитель


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


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




Суть: на сайте есть иерархические категории неограниченной вложенности, хранятся в виде ид и парентИд. При загрузке страницы выгружаются все целиком (не страшно, т.к. всё равно берутся из кэша). И для получения всех подкатегорий есть метод
PHP:
скопировать код в буфер обмена
  1. function get_sub_cats($id, $subcategory = false) {
  2.         global $cat_info;
  3.         $subfound = array ();
  4.        
  5.         if( ! $subcategory ) {
  6.                 $subcategory = array ();
  7.                 $subcategory[] = $id;
  8.         }
  9.        
  10.         foreach ( $cat_info as $cats ) {
  11.                 if( $cats['parentid'] == $id ) {
  12.                         $subfound[] = $cats['id'];
  13.                 }
  14.         }
  15.        
  16.         foreach ( $subfound as $parentid ) {
  17.                 $subcategory[] = $parentid;
  18.                 $subcategory = get_sub_cats( $parentid, $subcategory ); <--WTF??!
  19.         }
  20.        
  21.         return $subcategory;
  22. }


Вот оно как то работает, но логика работы с тем что хотел когда то написать автор явно не сходится Улыбка

Но на данный момент меня мучает вот какой вопрос: а оно работает правильно?
(Добавление)
Вот ещё бесчеловечно на вскидку переписанная версия:
PHP:
скопировать код в буфер обмена
  1.  
  2. function get_sub_cats($id, $subcategory = false) {
  3.   for($isContinue = false; $isContinue; $isContinue = false)
  4.   {
  5.     foreach ($cat_info as $cat)
  6.       if( in_array($cat['parentid'], $allow_cats) && !in_array($cat['id'], $allow_cats) )
  7.       {
  8.         $allow_cats[] = $cat['id'];
  9.         $isContinue = true;
  10.       }
  11.    }
  12. }
  13.  
Кто лучше?
 
 Top
OrmaJever
Отправлено: 08 Января, 2012 - 20:37:38
Post Id



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


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


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




а что в переменой $cat_info ?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
PATCH
Отправлено: 08 Января, 2012 - 20:43:28
Post Id



Частый посетитель


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


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




Но на данный момент меня мучает вот какой вопрос: а оно работает правильно? - а ты проверь)

(Отредактировано автором: 08 Января, 2012 - 20:45:24)

 
 Top
Самогонщик
Отправлено: 08 Января, 2012 - 20:51:19
Post Id



Посетитель


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


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




OrmaJever пишет:
а что в переменой $cat_info ?
Ассоциативный массив: ид категории => ассоциативный массив строк из бд таблицы категории. В строках из бд самое интересное это ид и парентИд.

Поковырял ещё, нашёл вторую реализацию, которая реально и используется
PHP:
скопировать код в буфер обмена
  1. function get_sub_cats($id, $subcategory = '') {
  2.        
  3.         global $cat_info;
  4.         $subfound = array ();
  5.        
  6.         if( $subcategory == '' ) $subcategory = $id;
  7.        
  8.         foreach ( $cat_info as $cats ) {
  9.                 if( $cats['parentid'] == $id ) {
  10.                         $subfound[] = $cats['id'];
  11.                 }
  12.         }
  13.        
  14.         foreach ( $subfound as $parentid ) {
  15.                 $subcategory .= "|" . $parentid;
  16.                 $subcategory = get_sub_cats( $parentid, $subcategory );
  17.         }
  18.        
  19.         return $subcategory;
  20. }
То ли эта переписанная версия той, то ли та переписанная версия этой. Но эта хотя бы правильно работает.
(Добавление)
PATCH пишет:
Но на данный момент меня мучает вот какой вопрос: а оно работает правильно? - а ты проверь)
*читать пафосным голосом*
Наш внутренний компилятор/интерпретатор должен давать ответы на такие вопросы без проверки .

(Отредактировано автором: 08 Января, 2012 - 20:51:46)

 
 Top
DeepVarvar Супермодератор
Отправлено: 27 Июля, 2013 - 04:36:04
Post Id



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


Покинул форум
Сообщений всего: 10418
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Привезли новую бензопилу. Рабочие испытывают. Положили ветку, пила справилась:
— У, <нехорошее слово>!
Положили лист фанеры, пила справилась:
— У, <нехорошее слово>!
Положили доску, пила справилась:
— У, <нехорошее слово>!
Положили бревно, пила справилась:
— У, <нехорошее слово>!
Положили под пилу рельс. Цепь лопнула, кровь-кишки.
— А, <нехорошее слово>!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Юмор »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB