PHP « апгрейд обычного дерева до Nested sets

В общем есть стандартная таблица с id, patent_id, level, etc. Нужно превратить её в полноценную Nested sets, для этого не хватает left_key и rigth_key. Поможите написать скриптец, чтобы обошёл все поля и выставил эти ключи. Можно просто алгоритм описать.

1 ответов



function tree_al_ns($s_table,$i_value=0,$k_parent=0)
//обновляет вложенные множества в соответствие со списками смежности
//$s_table содержит в себе имя таблицы с деревом.
//  В этой таблице дерево хранится комбинированным способом:
//  списки смежности и вложенные множества
//$i_value - идентификатор первого свободного значения (левого или правого)
//$k_parent - идентификатор текущей родительской вершины.
//  0 - для корневой вершины
//возвращает следующее свободное значение или
//  false в случае ошибки
//пример вызова:
//  if(tree_al_ns('t_catalog_tree')===false)
//    echo 'Конвертирование прошло с ошибками.';
{
  if(!is_numeric($k_parent)||!is_numeric($i_value)) return false;
  $r=mysql_query("select cat_id from ".$s_table." where parent_id=".$k_parent);
  if(!$r) return false;
  for($i=0;$i<mysql_num_rows($r);$i++)
  {
    $f=mysql_fetch_row($r);
    $k_item=$f[0];
    $i_right=tree_al_ns($s_table,$i_value+1,$k_item);
    if($i_right===false) return false;
    if(!mysql_query("
      update
        "
.$s_table."
      set
        left_key="
.$i_value.",
        right_key="
.$i_right."
      where
        cat_id="
.$k_item."
      "
)) return false;
    $i_value=$i_right+1;
  }
  return $i_value;
}
tree_al_ns($table);
 

мопед не мой