我尝试将树结构从一个数据库表复制到另一个数据库表。该结构是邻接列表模型。它看起来像:
id|parent_id|position
1|0|1
2|1|1
3|1|2
4|0|2
5|4|1
必要在另一个表中重新生成id(autoinc)!我有以下功能:
/**
* Copy a single node and return the new id
*/
public function copyNode($sn_data){
$this->db2->insert('items_configurations', $sn_data);
return $this->db2->insert_id();
}
/**
* Return a list of child nodes as an assoziative array
* from a given parent
*/
public function childList($parent_id){
$tmp = 'SELECT parent_id,item_id,template_id,position FROM items_templates WHERE parent_id='.$parent_id;
$tmp .= ' ORDER BY position';
$query=$this->db2->query($tmp);
return $query->result_array();
}
/**
* Copy the whole tree structure through an recursive function
*/
public function copyTree($node_data,$given_parent){
$new_parent = $this->copyNode($node_data);
$new_data = $this->childList($node_data['id']);
if(is_array($new_data)){
foreach($new_data as $new_node_data) :
$new_node_data['parent_id'] = $given_parent;
$new_node_data['configuration_id'] = $node_data['configuration_id'];
$this->copyTree($new_node_data,$new_parent);
endforeach;
}
}
/**
* First call of the function for example:
*/
$this->copyTree(array('parent_id' => 0,'item_id' => 40,'template_id' => 6,'position' => 1),0);
我想以递归方式进行,但它只复制前两行。错误在哪里?
答案 0 :(得分:1)
1.当您以递归方式遍历时,必须使用当前节点id
作为parent_id。你正在childList
中使用它的parent_id:
parent_id='.$parent_id;
必须 。PARENT_ID =” $ ID;
你正在获得这个节点的同伴,那么它就是孩子们。
2.我也对标记的行感到怀疑:
if(is_array($new_data)){
foreach($new_data as $new_node_data) :
$new_node_data['parent_id'] = $new_parent;//<--
$this->copyTree($new_node_data);
endforeach;
}
因为您有一个新的parent_id,然后将它与childList函数中的旧表一起使用。检查参数是否正确。