PHP无限级分类|无限分级树tree
这是一个新的方法,不针对任何框架,只是一个生成树的函数或者方法,把要生成树的对象或者数组传进去就OK,第一个函数用递归
public function toTree($sid,$pid){
$return = array();
$key = 0;
static $arr = array(); //分类级别参考数组
$sql = "select cid,pcid,name from shop_goods_catalog where sid='{$sid}' and pcid = '{$pid}'";
$result = $this->__db->query($sql);
while($row=$this->__db->fetchArray($result)){
$nbsp = '';
if($row['pcid']==0){
$arr = array();
}
$arr[] = $row['pcid'];
//顶级分类不添加树形结构标识。
if($row['pcid']>0){
//根据分类级别添加树形结构标识
$key = array_search($row['pcid'],$arr);
for($i=0;$i<$key;$i++){
$nbsp .= ' ';
}
//重构分类级别参考数组
if(count($arr)>1&&count(array_keys($arr,$row['pcid']))>1){
$arr = array_slice($arr,0,$key+1);
}
}
$row['name'] = $nbsp.$row['name'];
$row['level'] = $key; //分类级别,0为顶级分类,1为二级分类,用于样式设定或其他需求
$return[] = $row;
$r = $this->procCategory($sid,$row['cid']);
$return = array_merge($return,$r);
}
return $return;
}
是之前的函数方法
许多朋友总是问TP有没有无线分级,无线分级就是一个函数方法,通用的。
/**
* 将一个平面的二维数组按照指定的字段转换为树状结构
*
* 用法:
* @code php
* $rows = array(
* array('id' => 1, 'value' => '1-1', 'parent' => 0),
* array('id' => 2, 'value' => '2-1', 'parent' => 0),
* array('id' => 3, 'value' => '3-1', 'parent' => 0),
*
* array('id' => 7, 'value' => '2-1-1', 'parent' => 2),
* array('id' => 8, 'value' => '2-1-2', 'parent' => 2),
* array('id' => 9, 'value' => '3-1-1', 'parent' => 3),
* array('id' => 10, 'value' => '3-1-1-1', 'parent' => 9),
* );
*
* $tree = Helper_Array::tree($rows, 'id', 'parent', 'nodes');
*
* dump($tree);
* // 输出结果为:
* // array(
* // array('id' => 1, ..., 'nodes' => array()),
* // array('id' => 2, ..., 'nodes' => array(
* // array(..., 'parent' => 2, 'nodes' => array()),
* // array(..., 'parent' => 2, 'nodes' => array()),
* // ),
* // array('id' => 3, ..., 'nodes' => array(
* // array('id' => 9, ..., 'parent' => 3, 'nodes' => array(
* // array(..., , 'parent' => 9, 'nodes' => array(),
* // ),
* // ),
* // )
* @endcode
*
* 如果要获得任意节点为根的子树,可以使用 $refs 参数:
* @code php
* $refs = null;
* $tree = Helper_Array::tree($rows, 'id', 'parent', 'nodes', $refs);
*
* // 输出 id 为 3 的节点及其所有子节点
* $id = 3;
* dump($refs[$id]);
* @endcode
*
* @param array $arr
* 数据源
* @param string $key_node_id
* 节点ID字段名
* @param string $key_parent_id
* 节点父ID字段名
* @param string $key_childrens
* 保存子节点的字段名
* @param boolean $refs
* 是否在返回结果中包含节点引用
*
* return array 树形结构的数组
*/
function toTree($arr, $key_node_id, $key_parent_id = 'parent_id', $key_childrens = 'children', $treeIndex = false, & $refs = null) {
$refs = array();
foreach ($arr as $offset => $row) {
$arr[$offset][$key_childrens] = array();
$refs[$row[$key_node_id]] = & $arr[$offset];
}
$tree = array();
foreach ($arr as $offset => $row) {
$parent_id = $row[$key_parent_id];
if ($parent_id) {
if (!isset($refs[$parent_id])) {
if ($treeIndex) {
$tree[$offset] = & $arr[$offset];
}
else {
$tree[] = & $arr[$offset];
}
continue;
}
$parent = & $refs[$parent_id];
if ($treeIndex) {
$parent[$key_childrens][$offset] = & $arr[$offset];
}
else {
$parent[$key_childrens][] = & $arr[$offset];
}
}
else {
if ($treeIndex) {
$tree[$offset] = & $arr[$offset];
}
else {
$tree[] = & $arr[$offset];
}
}
}
return $tree;
}
请先登录后再评论登录