Вы можете формализовать то, что вы пытаетесь сделать здесь, с помощью теории графов. Вы хотите, чтобы все подключенные узлы были заданы по заданному списку смежности (своего рода).
Чтобы сделать это, вы хотите выполнить поиск в ширину графика. Это важно, чтобы избежать циклов.
Представление, которое вы выбрали, хотя и не совсем эффективно, но, безусловно, может сработать.
В псевдокоде ваш алгоритм должен выглядеть примерно так:
interesting-tags = input-tag
output = empty
for tag in interesting-tags: (Must be in order)
select related-tags to tag
for newtag in related-tags:
if newtag is not in output:
append newtag to interesting-tags and output
return output
Итак, интересные теги должны представлять собой некую форму очереди, поскольку вам нужно добавить новые элементы сзади и взять их спереди.
Выходные данные должны быть типа данных Set, так как вам нужно проверить, есть ли вещи в наборе, и добавить их.
Однако я незнаком с PHP и поэтому не знаю, что вам доступно. По крайней мере, вы можете реализовать необходимые операции с помощью всего лишь массива, даже если он может быть не совсем эффективным, он будет работать для нескольких тегов.