В этом сценарии вам нужно 2 массива для простой обработки и без сложных, первый массив должен содержать все ваши категории, например)
$catArr[categoryId] = 'categoryName';
Ваш второй массив должен иметь только родительский Id в качестве ключа и дочерний массив в качестве значения, например.)
$subCatArr[parentId] = Array([0]=>firstChildId, [1]=> secondChildId ..etc)
$subCatArr[parentId] = Array([0]=>firstChildId, [1]=> secondChildId ..etc)
Теперь вы можете перебирать свой массив $ subCatArr и иметь еще один цикл, чтобы иметь дочерние элементы и получать имена категорий из массива $ catArr.
Вы можете сделать этот метод, который также широко используется и очень прост,
запрос первого запуска для извлечения имени категории и отдельного родительского идентификатора и прохождения через него, а внутри цикла запускается другой запрос для извлечения всех записей, родительский идентификатор которых является текущим идентификатором цикла.