@teplyashin

Как вывести детей в рекурсии?

Добрый день всем! Подскажите пожалуйста новичку, пишу меню для админки, есть меню с многоуровневой вложенностью, сделал через рекурсию, в итоге, хотел чтоб на каждом уровне меню отображалась сумма конечных товаров в каждой подкатегории, а у меня отображаются только в конечном родителе
$res1 = mysqli_query(DB::db(), 'SELECT id,name,pid FROM ve_category WHERE toshow1 = 1 AND toshow = 1');
$num = mysqli_num_rows($res1);
if ($num > 0) {
	$cats = [];
	while ($cat =  mysqli_fetch_assoc($res1)) {
		$req1 = mysqli_fetch_assoc(mysqli_query(DB::db(), 'SELECT COUNT(a.good_id) as cnt FROM ve_goods_images as a join ve_goods as b on a.good_id = b.id WHERE b.category = ' . $row['id'] . ' AND b.inprod = 0 AND ( a.width < 500 or a.height < 500 or a.width / a.height < 3/4 or a.width / a.height > 4/3 )'));
		$cats_ID[$cat['id']][] = $cat;
		$cats[$cat['pid']][$cat['id']] =  $cat;
	}
}

function build_tree($cats, $pid, $only_parent)
{

	if (is_array($cats) and isset($cats[$pid])) {
		$tree = '<ul>';
		if ($only_parent == false) {
			foreach ($cats[$pid] as $cat) {
				$req1 = mysqli_fetch_assoc(mysqli_query(DB::db(), 'SELECT COUNT(a.good_id) as cnt FROM ve_goods_images as a join ve_goods as b on a.good_id = b.id WHERE b.category = ' . $cat['id'] . ' AND b.inprod = 0 AND ( a.width < 500 or a.height < 500 or a.width / a.height < 3/4 or a.width / a.height > 4/3 )'));
				$tree .= '<li>' . $cat['name'] . ' #' . $cat['id'] . ' (' . $req1['cnt'] . ' )';
				$tree .=  build_tree($cats, $cat['id'], false);
				$tree .= '</li>';
			}
		} elseif (is_numeric($only_parent)) {
			$cat = $cats[$pid][$only_parent];
			$res2 = mysqli_query(DB::db(), 'SELECT DISTINCT producer FROM ve_goods WHERE category= ' . $cats[$pid][$only_parent] . '');
			$tree = '<ul class="nested">11';

			while ($row1 = mysqli_fetch_assoc($res2)) {
				$goods_producer = $row1['producer'];

				$tree .= '<li><span class="caret">' . $goods_producer . '</span>';

				

				$tree .= '</li>';
			}
			$tree .= '</ul>';
		}
		$tree .= '</ul>';
	}


	return $tree;
}


function find_parent($tmp, $cur_id)
{
	if ($tmp[$cur_id][0]['pid'] != 0) {
		return find_parent($tmp, $tmp[$cur_id][0]['pid']);
	}
	return (int)$tmp[$cur_id][0]['id'];
}


echo build_tree($cats, 0, find_parent($cats_ID, [95, 113, 117, 118, 164, 352, 530, 815, 816, 817, 818, 916, 1249, 1419, 1460, 1588, 1614, 1624, 1644, 1789, 1918]));

вот что получается611661b22ffb9826065273.jpeg

у последнего родителя есть значения а выше по иерархии нули, помогите пожалуйста, вопрос жизни. я молодой специалист и только начал работать в этой сфере и мне нравиться все это , но с таким я не сталкивался, помогите пожалуйста
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Aricus
Предлагаю подсчёт количества сделать отдельной функцией, и тоже с рекурсией. Вариант не слишком хороший с точки зрения производительности (будет много запросов к БД), но за неимением лучшего сойдёт. Схема примерно такая:
function countGoods ($catId) {
  $result = ... // Здесь считаете количество товаров именно в этой категории
  $children = ... // Здесь получаете список дочерних категорий
  foreach ($children as $child) {
    $result += countGoods($child['id']);
  }
  return $result;
}
Ответ написан
Adamos
@Adamos
Попытался разобраться, что к чему, но код - лапша, конечно. Еще и с картинками какие-то заморочки, никак автором не описанные.
Эта архисложная задача точно не решается двумя запросами?
SELECT category_id, COUNT(id) FROM goods GROUP BY category_id
- чтобы получить количество в дальних категориях
и
SELECT * FROM categories ORDER BY pid ASC - чтобы построить дерево, подтянув к нему полученные выше значения и просуммировав их при выводе.

Единственная хитрость - не выводить сразу категорию, а потом подкатегории, а собрать и просуммировать подкатегории, а потом уже выводить и то, и другое, получив нужную сумму.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы