Задать вопрос
@bysobi

Как выбрать все дочерние категории главной категории?

Не получается выбрать все дочерние категории главной категории.
Структура таблицы category: 5b5677491bc5f077165181.png
У каждой категории есть parent_id. Если parent_id = 0, это значит это родитель
Нужно выбрать все category_id родителя в один массив.
Вот кусок кода, с которым я работал. Но он не выводит 3-4-5 вложенность категорий:
$filter_category_id тут родитель
if ($filter_category_id) {
            $this->load->model('catalog/category');
            $cats = array($filter_category_id);
            $cats = $this->model_catalog_category->getChildCategories($filter_category_id, $cats);

            $cats_merge = array();
            if ($cats) {
                foreach ($cats as $cat) {
                    $catsa = $this->model_catalog_category->getChildCategories($cat);
                    $cats_merge = array_merge($cats_merge, $catsa);
                }
            }
            $cats_merge = array_merge($cats_merge, $cats);
            $cats_merge = array_unique($cats_merge);

            return $cats_merge;
        }

А тут обращение к таблице:
public function getChildCategories($id, $cats = array()){
        $sql = "SELECT * FROM category WHERE parent_id  = " . $id;
        $result = $this->db->query($sql);
        $rows = $result->rows;
        if($rows){
            foreach($rows as $row){
                $cats[] = $row['category_id'];
                $this->getChildCategories($row['category_id'], $cats);
            }
        }
        return $cats;
    }


Нашел решение:
public function getCategoriesandSubs($parent_id = 0) {
      static $cat_branch = array();
      $results = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND c.status = 1");
      $num_rows = count($results->rows);
      if($num_rows != 0) {
         foreach ($results->rows as $result) {
            $cat_branch[] = $result['category_id'];
            $this->getCategoriesandSubs($result['category_id']);
         }
      }
      if(count($cat_branch) == 0) {
        $cat_branch[] = $parent_id;
      }
      return $cat_branch;
   }
  • Вопрос задан
  • 830 просмотров
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 3
VladimirAndreev
@VladimirAndreev
php web dev
Это цикл нужен вам.
На первой итерации вы запрашиваете ид потомков родителей, на каждой следующей - потомков выбранных на предыдущей. Как только выборка потомков пуста - так и останавливаете цикл.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
https://dev.mysql.com/doc/refman/8.0/en/with.html
красиво, рекурсивно
Ответ написан
Комментировать
Я использую следующее:
<?php
// Получение сплошного списка
function get_cat()
{
	global $pdo;
	$cat_arr = [];

            try
            {
                $query = "SELECT ID, PID, NAME FROM `catalog` WHERE 1";
                $stmt = $pdo->prepare( $query );
                $stmt->execute();
            }
            catch (PDOException $e)
            {
              die("Error in :".__FILE__." file, at ".__LINE__." line. Can't get data : " . $e->getMessage());
            }
            while( $row = $stmt->fetch(PDO::FETCH_ASSOC ) )
			$cat_arr[$row['ID']] = $row;

	return $cat_arr;
}

// Построение дерева
function tree_map( $dataset ) 
{
	$tree = [];

	foreach ($dataset as $id=>&$node) 
		if (!$node['PID'])
			$tree[$id] = &$node;
				else
	$dataset[$node['PID']]['childs'][$id] = &$node;
 	return $tree;
}

$dataset = get_cat();
$dataset = tree_map( $dataset );

Используется PDO, но это неважно. В результирующем массиве имеем дерево со связями child-PID.
Для удобной визуализации данных использую:
<?php
    function debug( $arr )
    {
        $str = print_r($arr, true);
        echo '<pre>'.$str.'</pre>';
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы