Недавно, возникла потребность сделать древовидный, порядковый список категорий, в одном из проектов. 2 главных условия, которые соблюдал: 1) в html должны наглядно показываться родительские элементы и их "дети"; 2) для всей операции 1 SQL запрос. SQL-структура была такая:
  1. ---------------------------------------------------------------------------------
  2. | FIELD          | Type             | NULL   | KEY | DEFAULT   | Extra
  3.  ---------------------------------------------------------------------------------
  4. | categoryID     | int(3)           | NO    | PRI   | NULL     | AUTO_INCREMENT  |
  5. | parent         | int(3)           | NO    |       | 0        |                 |
  6. | name           | varchar(255)     | NO    |       | NULL     |                 |
  7. | slug           | varchar(255)     | NO    |       | NULL     |                 |
  8. | pic            | varchar(255)     | YES   |       | NULL     |                 |
  9.  ---------------------------------------------------------------------------------
  10. 5 rows IN SET (0.03 sec)
После запроса в БД массив получился такой.
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [categoryID] => 1
  6.             [parent] => 0
  7.             [name] => Фильмы
  8.             [slug] => films
  9.             [pic] =>
  10.         )
  11.  
  12.     [1] => Array
  13.         (
  14.             [categoryID] => 2
  15.             [parent] => 0
  16.             [name] => Музыка
  17.             [slug] => music
  18.             [pic] =>
  19.         )
  20. [...]
  21. )
Для удобной работы я сгруппировал массив по categoryID, заменив его ключи на этот идентификатор.
  1. foreach ($data AS $v)
  2. $array[$v['categoryID']] = $v;
А вот и сама функция, которая пишет в глобальный массив $g_data результат своей рекурсивной работы.
  1. FUNCTION tree (&$data, $node_id, $lvl = 0)
  2. {
  3.    switch ($lvl)
  4.    {
  5.       // для каждой категории может быть действие (напр. присвоить id)
  6.         case 0:
  7.         $html = '<option style="font-weight:bolder;" disabled>- КОРЕНЬ -</strong>'."\n";
  8.         break;
  9.         DEFAULT:
  10.         /* str_repeat делает отступ слева, в зависимости от уровня кат-ии. Это наглядно показывает юзеру родителя категории и его дочерний элемент. А если кат-я самая "верхняя", она выделяется стилем font-weight:bold */
  11.         $html = '<option '.($data[$node_id]['parent']==0?'style="font-weight:bold;':'').' value="'.$data[$node_id]['categoryID'].'">'.str_repeat('  ', $lvl) . $data[$node_id]['name'].'</option>'."\n";
  12.     }
  13.   $this->g_data['tree'] .= $html;
  14.        
  15.    // рекурсия
  16.    foreach ($data AS $row)
  17.       IF ($row['parent'] == $node_id)
  18.          $this->tree($data, $row['categoryID'], $lvl   1);
  19. }
Остаётся только запустить процесс.
tree($array, 0);


Нет аватара

pyncelern 01 сентября в 22:51 #

Tadalafil with once-daily OAD and on-demand pro re nata PRN dose regimens is sufficient for treating ED tadalista vs cialis

Нет аватара

pyncelern 01 сентября в 22:51 #

Tadalafil with once-daily OAD and on-demand pro re nata PRN dose regimens is sufficient for treating ED tadalista vs cialis

Нет аватара

Quapipt 04 сентября в 04:43 #

This drug should be stored at controlled temperatures priligy dosage

Нет аватара

Quapipt 04 сентября в 04:43 #

This drug should be stored at controlled temperatures priligy dosage

Нет аватара

ignomia 06 сентября в 03:30 #

DERMAFACS RecoverX Review Does This Skin Repair Cream Work buy cialis 5mg daily use Selected from data included with permission and copyrighted by First Databank, Inc

Нет аватара

ignomia 06 сентября в 03:30 #

DERMAFACS RecoverX Review Does This Skin Repair Cream Work buy cialis 5mg daily use Selected from data included with permission and copyrighted by First Databank, Inc

Нет аватара

Speelycle 08 сентября в 12:21 #

cialis generic 5mg Viagra, recreational use

Нет аватара

Speelycle 08 сентября в 12:21 #

cialis generic 5mg Viagra, recreational use

Нет аватара

Altendelf 11 сентября в 04:34 #

clomid generic name The methods used to determine hCG have changed since the studies, on which the present recommendations are based, were performed.

Нет аватара

Altendelf 11 сентября в 04:34 #

clomid generic name The methods used to determine hCG have changed since the studies, on which the present recommendations are based, were performed.

Нет аватара

FesUlceme 14 сентября в 10:37 #

post cycle therapy nolvadex

Нет аватара

FesUlceme 14 сентября в 10:37 #

post cycle therapy nolvadex

Нет аватара

amizavy 17 сентября в 19:57 #

doxycycline dosage for lyme disease Most notably, it showed selective cytotoxicity against five renal cancer cell lines 786- 0, ACHN, CAK- 1, TK- 10 and UO- 31, with a mean LC 50 of 0.

Нет аватара

amizavy 17 сентября в 19:58 #

doxycycline dosage for lyme disease Most notably, it showed selective cytotoxicity against five renal cancer cell lines 786- 0, ACHN, CAK- 1, TK- 10 and UO- 31, with a mean LC 50 of 0.


Войдите или зарегистрируйтесь, чтобы написать комментарий.