Организация бд (бесконечные подкатегории)

Рейтинг: 0Ответов: 2Опубликовано: 16.10.2014

Приветствую вас.

Нужен совет, как организовать структуру бд, бесконечных подкатегорий.

Категория
-Подкатегория
--ПодПодкатегория
---ПодПодПодкатегория
---- и так далее...

Ответы

▲ 1Принят

Достаточно хранить id родителя, а потом с помощью рекурсивной функции строить дерево. В следующем примере данные считываются с .csv файла, потом с помощью рекурсивной функции строится дерево.

В примере достаточно изменить считывание данных с бд и вывод данных.

<?php
function fillSpace($count) {
  $str="";
  for($i=0;$i<$count*2;$i++) {
    $str.=" ";
  }
  return $str;
}

function createTree($data,$parent_id,$k,$tree=""){
  if (isset($data[$parent_id]) && count($data[$parent_id])!=0){
    foreach($data[$parent_id] as $cat){
      $tree .= fillSpace($k).$cat["name"].' #'.$cat["id"]."\r\n";
      $tree .= createTree($data,$cat["id"],$k+1);
    }
  }
  else return null;
  return $tree;
}

$handle = fopen("categories.csv", "r") or die("Error of file!");
$i=0;
$data=array(); //array of data from file

while($str=fgetcsv($handle,1000,";")) { 
  //rename keys for easy operation
  //first column is "id", second - "parent"_id and third - "name category"
  $namedStr=array("id" => $str[0],"parent_id" => $str[1],"name" => $str[2]);

  //add category in array
  $data[$namedStr["parent_id"]][$namedStr["id"]] = $namedStr;
}

//build tree
$content=createTree($data,"",0);

//print tree
echo $content;
fclose($handle);

Файл categories.csv:

1;;category
10;;category
2;1;sub-category
3;2;sub-sub-category
4;1;sub-category
5;;category
6;5;sub-category
7;5;sub-category
9;3;sub-sub-sub-category
8;5;sub-category
▲ 1

Лучше не поленись и изучи дерево NESTED SETS.

P.S. Если пишешь на YII, то для него даже расширения есть - можно вообще не учить. :-)