2017.5.22 北京 大雨

来到公司之后, 准备把代码移植到公司的小项目里,移植的过程中发现了一处设计有问题的地方,调整一下。

第一处错误是:构建叶子节点的时候,只保存了节点的名称,没有存ID, 如果页面跟后台交互的时候,当存在节点名称一样的情况,服务器就不能判断出用户正在再操作那个节点。


更改了一下数据结构的定义:
用数组来存放一个节点, 如果这个节点是末端节点,则该数组,只有一个字符串元素,

如果一个节点为叶子节点,则该节点将会有两个字符串元素,第一元素存节点名称,第二个元素存节点ID。
如果这个节点存在子节点,则在当前数组中,增加一个数组,所有的子节点的元素存放在这个数组中。

从数据库中取数据的代码调整如下:

functionbuild_book_tree($data,$parentid){$nodeName='';$child=[];foreach($dataas$key=>$val){//如果当前遍历的项跟查询的id相同,则获取节点的名称if($val[0]==$parentid){$nodeName=$val[1];}//如果当前节点的父节点跟查询的节点相同,则通过递归,获取他的子节点,并将结果,赋给当前节点节点数组中if($val[2]==$parentid){array_push($child,build_book_tree($data,$val[0]));}}//不存放空节点if(count($child)>0)returnarray($nodeName,$child);else//return$nodeName;return[$nodeName,$parentid];}

生成HTML list的代码调整如下

functionbuild_html_list($data){//输出标准父子节点if(is_array($data)andcount($data)==2){if(is_string($data[0])andis_array($data[1])){//输出节点名echo"<li>".$data[0];//输出子节点if(is_array($data[1])){echo"<ul>";foreach($data[1]as$item){if(is_string($item)){echo"<li>".$item."</li>";}else{build_html_list($item);}}echo"</ul>";}echo"</li>";}//输出叶子节点2017.5.22addbysunhuelseif(is_string($data[0])andis_int($data[1])){echosprintf('<licid="%d">%s</li>',$data[1],$data[0]);}}}

这样,如果用户单击一个 li 元素的时候,就可以从 li元素的 cid 属性中,查找到 节点 id 了