原始数据
$array = array( array('id' => 1, 'pid' => 0, 'n' => '河北省'), array('id' => 2, 'pid' => 0, 'n' => '北京市'), array('id' => 3, 'pid' => 1, 'n' => '邯郸市'), array('id' => 4, 'pid' => 2, 'n' => '朝阳区'), array('id' => 5, 'pid' => 2, 'n' => '通州区'), array('id' => 6, 'pid' => 4, 'n' => '望京'), array('id' => 7, 'pid' => 4, 'n' => '酒仙桥'), array('id' => 8, 'pid' => 3, 'n' => '永年区'), array('id' => 9, 'pid' => 1, 'n' => '武安市'), array('id' => 10, 'pid' => 8, 'n' => '永年区镇'), array('id' => 11, 'pid' => 0, 'n' => '上海市') );
生成无限极分类
/** 所有的分类 * @parem $array 数组 * @parem $pid ,最高级别,默认为0,输出从pid 级别的数据 * @parem $level 层级,默认0 * */ function getTree($array, $pid =0, $level = 0){ $f_name=__FUNCTION__; // 定义当前函数名 //声明静态数组,避免递归调用时,多次声明导致数组覆盖 static $list = []; foreach ($array as $key => $value){ //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点 if ($value['pid'] == $pid){ //父节点为根节点的节点,级别为0,也就是第一级 $flg = str_repeat('|--',$level); // 更新 名称值 $value['n'] = $flg.$value['n']; // 输出 名称 echo $value['n']."<br/>"; //把数组放到list中 $list[] = $value; //把这个节点从数组中移除,减少后续递归消耗 unset($array[$key]); //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1 $f_name($array, $value['id'], $level+1); } } return $list; } // 调用 $list=getTree($array);
调用结果:
河北省 |--邯郸市 |--|--永年区 |--|--|--永年区镇 |--武安市 北京市 |--朝阳区 |--|--望京 |--|--酒仙桥 |--通州区
嵌套标签,前端可以(通过选取子节点)全选、取消全选
function getTree($array, $pid =0, $level = 0){ $f_name=__FUNCTION__; // 定义当前函数名 // 空数组 不在执行 if(empty($array)) return; //声明静态数组,避免递归调用时,多次声明导致数组覆盖 static $html; $html.="<ul>"; foreach ($array as $key => $value){ //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点 if ($value['pid'] == $pid){ //父节点为根节点的节点,级别为0,也就是第一级 $flg = str_repeat('|--',$level); // 更新 名称值 $value['n'] = $flg.$value['n']; $html.=$temp="<li><input type=\"checkbox\" name=\"limit_id[]\" value='".$value['id']."' >".$value['n']; //把这个节点从数组中移除,减少后续递归消耗 unset($array[$key]); //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1 $vv=$f_name($array, $value['id'], $level+1); // 如果顶级分类下没有一个下级,删除此分类,此步骤可以省略 if(empty($vv) && ($pid<1)) { $html=str_replace($temp,'',$html); } $html.="</li>\r\n"; } } $html.="</ul>\r\n"; // 删除多余的 ul 标签 $html=str_replace("<ul></ul>",'',$html); return $html; }
html 输出结果
<ul>
<li><input type="checkbox" name="limit_id[]" value='1'>河北省
<ul>
<li><input type="checkbox" name="limit_id[]" value='3'>|--邯郸市
<ul>
<li><input type="checkbox" name="limit_id[]" value='8'>|--|--永年区
<ul>
<li><input type="checkbox" name="limit_id[]" value='10'>|--|--|--永年区镇
</li>
</ul>
</li>
</ul>
</li>
<li><input type="checkbox" name="limit_id[]" value='9'>|--武安市
</li>
</ul>
</li>
<li><input type="checkbox" name="limit_id[]" value='2'>北京市
<ul>
<li><input type="checkbox" name="limit_id[]" value='4'>|--朝阳区
<ul>
<li><input type="checkbox" name="limit_id[]" value='6'>|--|--望京
</li>
<li><input type="checkbox" name="limit_id[]" value='7'>|--|--酒仙桥
</li>
</ul>
</li>
<li><input type="checkbox" name="limit_id[]" value='5'>|--通州区
</li>
</ul>
</li>
</li>
</ul>