Попытался разобраться, что к чему, но код - лапша, конечно. Еще и с картинками какие-то заморочки, никак автором не описанные.
Эта архисложная задача точно не решается двумя запросами?
SELECT category_id, COUNT(id) FROM goods GROUP BY category_id
- чтобы получить количество в дальних категориях
и
SELECT * FROM categories ORDER BY pid ASC
- чтобы построить дерево, подтянув к нему полученные выше значения и просуммировав их при выводе.
Единственная хитрость - не выводить сразу категорию, а потом подкатегории, а собрать и просуммировать подкатегории, а потом уже выводить и то, и другое, получив нужную сумму.