这里使用一张简单的地区表举例,表字段如下:
使用Sql:
SELECT id, parentid, name FROM area;
查询得出的数据形如:
array(3362){ [0] => array(3) { ["id"] => string(1) "1" ["parentid"] => string(1) "0" ["name"] => string(9) "北京" } [1] => array(3) { ["id"] => string(1) "2" ["parentid"] => string(1) "1" ["name"] => string(9) "北京市" } [2] => array(3) { ["id"] => string(1) "3" ["parentid"] => string(1) "2" ["name"] => string(9) "东城区" } [3] => array(3) { ["id"] => string(1) "4" ["parentid"] => string(1) "2" ["name"] => string(9) "西城区" } [4] => array(3) { ["id"] => string(1) "5" ["parentid"] => string(1) "2" ["name"] => string(9) "崇文区" }
...... }
使用函数xmsb_getDataTree:
/** * @desc xmsb_getDataTree 无限级分类函数 * @param array $datas 查询出的数据 * @param string $primaryKey 数据表的主键 * @param string $parentKey 父节点字段名 * @param string $nameKey 需要用到的名称字段 * @param integer $firstParent 根节点主键值 * @return array 返回树状结果集 */ function xmsb_getDataTree($datas, $primaryKey, $parentKey, $nameKey, $firstParent = 0) { if(!is_array($datas) || !$primaryKey || !$parentKey || !$nameKey) return false; $tree = array($primaryKey => 0, $parentKey => 0, $nameKey => 'xmsb'); $tmpMap = array($firstParent => & $tree); foreach($datas as $rk => $rv) { $tmpMap[$rv[$primaryKey]] = array ( $primaryKey => $rv[$primaryKey], $parentKey => $rv[$parentKey], $nameKey => $rv[$nameKey] ); $parentObj = & $tmpMap[$rv[$parentKey]]; if(!$parentObj['children']) $parentObj['children'] = array(); $parentObj['children'][] = & $tmpMap[$rv[$primaryKey]]; } return $tree['children']; }
返回值形如:
array(34) { [0] => array(4) { ["id"] => string(1) "1" ["parentid"] => string(1) "0" ["name"] => string(9) "北京" ["children"] => array(1) { [0] => array(4) { ["id"] => string(1) "2" ["parentid"] => string(1) "1" ["name"] => string(9) "北京市" ["children"] => array(18) { [0] => array(3) { ["id"] => string(1) "3" ["parentid"] => string(1) "2" ["name"] => string(9) "东城区" } [1] => array(3) { ["id"] => string(1) "4" ["parentid"] => string(1) "2" ["name"] => string(9) "西城区" } ...... } }
...... } } ...... }