无限级分类函数

浏览:1503 最后更新:2016-11-20 19:56 分类:函数 关键字: 无限分级 toTree
这是一个新的方法,不针对任何框架,只是一个生成树的函数或者方法,把要生成树的对象或者数组传进去就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;
}
评论( 相关
后面还有条评论,点击查看>>