Home  >  Article  >  Backend Development  >  PHP tree structure data access instance class_PHP tutorial

PHP tree structure data access instance class_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 16:57:48824browse

This article will share with you a good tree structure php code, which friends can refer to.

The code is as follows Copy code


/**
 * Tanphp framework
 *
 *
 * @category   Tanphp
 * @package    Data_structure
 * @copyright  Copyright (c) 2012 谭博  tanbo.name
 * @version    $Id: Tree.php 25024 2012-11-26 22:22:22 tanbo $
 */


/**
* Tree structure data access class
*
* Used for fast access to tree structure data
*
* @param array $arr The parameter must be a standard two-dimensional array, including the index field (id) and the field representing the tree structure (path), as shown in example
*
* @example <br> * $arr = array(<br> * array( 'id' => 1, 'name' => 'php', 'path' => '1' ),<br> * array( 'id' => 3, 'name' => 'php1', 'path' => '1-3' ),<br> * array( 'id' => 2, 'name' => 'mysql', 'path' => '2' ),<br> * array( 'id' => 6, 'name' => 'mysql1', 'path' => '2-6' ),<br> * array( 'id' => 7, 'name' => 'mysql2', 'path' => '2-7' ),<br> * array( 'id' => 5, 'name' => 'php11', 'path' => '1-3-5' ),<br> * array( 'id' => 4, 'name' => 'php2', 'path' => '1-4' ),<br> * );<br> * $cate = new Tree($arr);<br> * <br> * $data = $cate->getChild(2);<br> * <br> * print_r($data->toArray());<br> *
*
​*/

class Tree
{
Public $_info; //Node information
Public $_child = array(); //Child node
private $_parent; //Parent node
private $_data; //Temporary data for the current operation
Private static $_indexs = array(); //Indices of all nodes
Private static $_index_key = 'id'; //Index key
Private static $_tree_key = 'path'; //Tree structure expression key
Private static $_tree_delimiter = '-'; // Attribute structure expression delimiter
 
 
 
/**
* Constructor
* *
* @param array $arr
* @param boole $force_sort If true, $arr will be forced to be sorted
* @return void
​​*/
Public function __construct(array $arr = array(), $force_sort=true)
{
            if ($force_sort === true) {
                 $arr=$this->_array_sort($arr, self::$_tree_key);
}
If (!empty($arr)) {
                 $this->_init($arr);
}
}
 
/**
* Initial storage of tree data
* *
* @param array $arr
* @return void
​​*/
Private function _init(array $arr)
{
foreach ($arr as $item) {
                                                                                                                                                                                $paths = explode(self::$_tree_delimiter, $path);
               $count_paths = count($paths);
$parent_id = isset($paths[$count_paths-2]) ? $paths[$count_paths-2] : NULL;
                                                                      if ( $count_paths>1                                                                                                                                                                                                                   && array_key_exists($parent_id, self::$_indexs)                                                    ​                                                                                                                                                                                                                        ) {
                     self::$_indexs[$parent_id]->addChild($item);
                } elseif ($count_paths == 1) {
$this->addChild($item);
              } else {
                        throw new Exception("path data error".var_export($item, true));
            }
           
        }
       
        //print_r(self::$_indexs);
    }
   
    /**
* Add child node
* *
* @param array $item
* @return void
​​*/
    public function addChild(array $item, $parent = NULL)
    {
        $child          = new Tree();
        $child->_info   = $item;
        $child->_parent = $parent == NULL ? $this : $parent;
        $child->_parent->_child[] =  $child;
       
        $this->_addIndex($item, $child->_getSelf());
    }
   
    /**
* Add node to index
* *
* @param array $item
* @param mix $value
* @return void
​​*/
    private function _addIndex(array $item, $value)
    {
        if (array_key_exists(self::$_index_key, $item) && is_int($item[self::$_index_key])) {
            self::$_indexs[$item[self::$_index_key]] = $value;
        } else {
            throw new Exception("id字段不存在或者不为字符串");
        }
    }
   
   
    /**
* Get a reference to yourself
* *
* @return Tree object quote
​​*/
    private function _getSelf()
    {
        return $this;
    }
   
    /**
* Get the child nodes of the node with the specified id
* *
* @param int $id
* @return Tree object
​​*/
    public function getChild($id)
    {
        $data       = self::$_indexs[$id]->_child;
        $this->_data = $data;
        return $this;
    }
   
    /**
* Get the parent node of the node with the specified id
* *
* @param int $id
* @return Tree object
​​*/
    public function getParent($id)
    {
        $data = self::$_indexs[$id]->_parent;
        $this->_data = $data;
        return $this;
    }
   
    /**
* Get the sibling nodes of the node with the specified id
*
* @param int $id
* @return Tree object
​​*/
    public function getBrother($id)
    {
        $data = self::$_indexs[$id]->_parent->_child;
        $this->_data = $data;
        return $this;
    }
   
    /**
     * 将Tree对象转化为数组
     *
     * @param  object $object
     * @return array
     */
     public function toArray($obj = NULL)
     {
        $obj  = ($obj === NULL) ? $this->_data : $obj;
        $arr  = array();
        $_arr = is_object($obj) ? $this->_getBaseInfo($obj) : $obj;
       
        if (is_array($_arr)) {
            foreach ($_arr as $key => $val){
               
                $val = (is_array($val) || is_object($val)) ? $this->toArray($val) : $val;
                   
                $arr[$key] = $val;
            }
        } else {
            throw new Exception("_arr不是数组");
        }
       
    
        return $arr;
    }
   
    /**
* * Filter fields such as _parent to avoid infinite loops
* *
* @param object $obj
* @return void
​​*/
    private function _getBaseInfo($obj)
    {
        $vars = get_object_vars($obj);
        $baseInfo['_info']  =  $vars['_info'];
        $baseInfo['_child'] =  $vars['_child'];
        return $baseInfo;
    }
   
    /**
* * Two-dimensional array sorting
*
* Arrange the two-dimensional array in ascending or descending order according to the specified key name
*
* @param array $arr two-dimensional array
* @param string $keys
* @param string $type must be asc or desc
* @throws throws an exception when the parameter is illegal
* @return Returns the sorted array
​​*/
    private function _array_sort(array $arr, $keys, $type = 'asc') {
        if (!is_string($keys)) {
            throw new Exception("非法参数keys:参数keys的类型必须为字符串");
        }
   
        $keysvalue = $new_array = array();
        foreach ($arr as $k=>$v) {
            if (!is_array($v) || !isset($v[$keys])) {
                throw new Exception("参数arr不是二维数组或arr子元素中不存在键'{$keys}'");
            }
            $keysvalue[$k] = $v[$keys];
        }
   
        switch ($type) {
            case 'asc':
                asort($keysvalue);
                break;
            case 'desc':
                arsort($keysvalue);
                break;
            default:
throw new Exception("Illegal parameter type: the value of parameter type must be 'asc' or 'desc'");
}
 
           reset($keysvalue);
foreach ($keysvalue as $k=>$v) {
               $new_array[$k] = $arr[$k];
}
          return $new_array;
}
 
}

?>

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/631511.htmlTechArticleThis article will share with you a good tree structure php class code, friends can refer to it. The code is as follows Copy code ?php /** * Tanphp framework * * * @category Tanphp * @pack...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn