Показать сообщение отдельно
  #1 (permalink)  
Старый 21.11.2016, 13:54
St. St. вне форума
Аспирант
Отправить личное сообщение для St. Посмотреть профиль Найти все сообщения от St.
 
Регистрация: 15.04.2016
Сообщений: 53

Построение одной ветке от текущего id_cat до самого верхнего.
Помогите пожалуйста с правильным решением!
Интересуют еще примеры для решения этой задачи, т.е. оптимизация, скорость выполнения...
Туго у меня с этими ветками и деревьями.

У меня получилось так (см. ниже).

Входящий идентификатор категории/подкатегории в $id_cat.
Если $id_cat = 100, то получим на выходе: Разделы > Раздел 1.
Если $id_cat = 102, то получим на выходе: Разделы > Раздел 3 > Раздел 3.1.



// Построение одной ветке от текущего id_cat до самого верхнего.

// Пример.
//    Разделы > Раздел 3 > Раздел 3.1

/*
id_cat  parent_id  title
    98          0  Разделы
   100         98  Раздел 1
   101         98  Раздел 3
   102        101  Раздел 3.1
   106         98  Раздел 2

*/

// Получаем все id_cat и parent_id.
$query = "SELECT `id_cat`, `parent_id` FROM dl_category";
$result = mysql_query($query);

// Все id_cat и parent_id в массив.
while($row = mysql_fetch_assoc($result))
   {
   $arr_id_cat_all[] = $row['id_cat'];
   $arr_parent_id_all[] = $row['parent_id'];
   }

mysql_free_result($result);

// Получаем ветку id_cat'ов.
// От текущего id_cat до самого верхнего (до нулевого).
if ($id_cat != '0')
   {
   $id_cat_tmp = $id_cat;
   for ($x = 0; $x < count($arr_id_cat_all); $x++)
      {
      if ($arr_id_cat_all[$x] == $id_cat_tmp)
         {
         // id_cat'ы в массив $branch_id_cat[].
         $branch_id_cat[] = $id_cat_tmp;
         // Родитель.
         $id_cat_tmp = $arr_parent_id_all[$x];

         if ($id_cat_tmp != '0')
            {
            // Нет, еще не все.
            $x=0;
            }
            else
            {
            // Все id_cat'ы уже в массиве,
            // в такой последовательности: 54321;
            $branch_id_cat[] = $id_cat_tmp;

            // Поменять местами 54321 на 12345.
            for ($x = count($branch_id_cat) - 1; $x >= 0; $x--)
               {
               $new_branch_id_cat[] = $branch_id_cat[$x];
               }

            // Все...
            break;
            }
         }
      }
   }
   else
   {
   $new_branch_id_cat[] = '0';
   }

// Сделать: 1,2,3,4,5
$string_branch = implode(",", $new_branch_id_cat);

Последний раз редактировалось St., 21.11.2016 в 14:39.
Ответить с цитированием