У меня есть набор объектов в иерархии. Есть верхний «корневой» узел, у которого есть дочерние узлы, которые, в свою очередь, имеют дочерние узлы и т. д. Я пытаюсь сохранить эту структуру в БД, используя модель вложенного набора, где каждая «сторона» каждого узла пронумерована для определения иерархия, как в разделе Управление иерархическими данными в MySQL:
(источник: mysql.com)
Моя проблема заключается в вычислении левого и правого значений. Обычно я использую RecursiveIteratorIterator для перебора иерархии, но не могу понять, как вычислить числа, не прибегая к рекурсивной функции, которая анализирует индексную переменную по ссылке.
Любые идеи?
Вероятно, это бесполезно, но это (неправильный) код, который у меня сейчас есть:
$iterator = new RecursiveIteratorIterator(
new Node_List(array($root)),
RecursiveIteratorIterator::SELF_FIRST);
$i = 0;
foreach ($iterator as $node) {
$node->left = ++$i;
$node->right = ++$i;
}
Как видите, это даст что-то вроде этого:
Node
Node
Node
Левое и правое значения:
Node (1, 2)
Node (3, 4)
Node (5, 6)
Когда они должны быть:
Node (1, 6)
Node (2, 3)
Node (4, 5)