Home php教程 php手册 php树形结构数据存取实例类

php树形结构数据存取实例类

May 25, 2016 pm 04:54 PM
explode foreach

本文章来给大家分享一款不错的树形结构的php类代码,各位朋友可参考。
 代码如下 复制代码


/**
 * 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 $
 */


/**
 * 树形结构数据存取类
 *
 * 用于对树形结构数据进行快速的存取
 *
 * @param array $arr 参数必须为标准的二维数组,包含索引字段(id)与表示树形结构的字段(path),如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;                             //节点信息
    public  $_child = array();                  //子节点
    private $_parent;                           //父节点
    private $_data;                             //当前操作的临时数据
    private static $_indexs         = array();  //所有节点的索引
    private static $_index_key      = 'id';     //索引键
    private static $_tree_key       = 'path';   //树形结构表达键
    private static $_tree_delimiter = '-';      //属性结构表达分割符
   
   
   
    /**
     * 构造函数
     *
     * @param array $arr
     * @param boole $force_sort 如果为真,将会强制对$arr 进行排序
     * @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);
        }
    }
   
    /**
     * 初始存储树形数据
     *
     * @param array $arr
     * @return void
     */
    private function _init(array $arr)
    {
        foreach ($arr as $item) {
            $path        = $item[self::$_tree_key];
            $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] instanceof Tree    //父级为Tree对象
            ) {
                self::$_indexs[$parent_id]->addChild($item);
            } elseif ($count_paths == 1) {
                $this->addChild($item);
            } else {
                throw new Exception("path数据错误".var_export($item, true));
            }
           
        }
       
        //print_r(self::$_indexs);
    }
   
    /**
     * 添加子节点
     *
     * @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());
    }
   
    /**
     * 添加节点到索引
     *
     * @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字段不存在或者不为字符串");
        }
    }
   
   
    /**
     * 获取对自己的引用
     *
     * @return Tree object quote
     */
    private function _getSelf()
    {
        return $this;
    }
   
    /**
     * 获取指定id的节点的子节点
     *
     * @param int $id
     * @return Tree object
     */
    public function getChild($id)
    {
        $data       = self::$_indexs[$id]->_child;
        $this->_data = $data;
        return $this;
    }
   
    /**
     * 获取指定id的节点的父节点
     *
     * @param int $id
     * @return Tree object
     */
    public function getParent($id)
    {
        $data = self::$_indexs[$id]->_parent;
        $this->_data = $data;
        return $this;
    }
   
    /**
     * 获取指定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;
    }
   
    /**
     * 过滤_parent等字段,以免造成无限循环
     *
     * @param object $obj
     * @return void
     */
    private function _getBaseInfo($obj)
    {
        $vars = get_object_vars($obj);
        $baseInfo['_info']  =  $vars['_info'];
        $baseInfo['_child'] =  $vars['_child'];
        return $baseInfo;
    }
   
    /**
     * 二维数组排序
     *
     * 根据指定的键名对二维数组进行升序或者降序排列
     *
     * @param array  $arr 二维数组
     * @param string $keys
     * @param string $type 必须为 asc或desc
     * @throws 当参数非法时抛出异常
     * @return 返回排序好的数组
     */
    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("非法参数type :参数type的值必须为 'asc' 或 'desc'");
        }
   
        reset($keysvalue);
        foreach ($keysvalue as $k=>$v) {
            $new_array[$k] = $arr[$k];
        }
        return $new_array;
    }
   
}

?>



教程地址:

欢迎转载!但请带上文章地址^^

Statement of this Website
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

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What is the difference between using foreach and iterator to delete elements when traversing Java ArrayList? What is the difference between using foreach and iterator to delete elements when traversing Java ArrayList? Apr 27, 2023 pm 03:40 PM

1. The difference between Iterator and foreach is the polymorphic difference (the bottom layer of foreach is Iterator) Iterator is an interface type, it does not care about the type of collection or array; both for and foreach need to know the type of collection first, even the type of elements in the collection; 1. Why is it said that the bottom layer of foreach is the code written by Iterator: Decompiled code: 2. The difference between remove in foreach and iterator. First, look at the Alibaba Java Development Manual, but no error will be reported in case 1, and an error will be reported in case 2 (java. util.ConcurrentModificationException) first

How to determine the number of foreach loop in php How to determine the number of foreach loop in php Jul 10, 2023 pm 02:18 PM

​The steps for PHP to determine the number of the foreach loop: 1. Create an array of "$fruits"; 2. Create a counter variable "$counter" with an initial value of 0; 3. Use "foreach" to loop through the array, and Increase the value of the counter variable in the loop body, and then output each element and their index; 4. Output the value of the counter variable outside the "foreach" loop to confirm which element the loop reaches.

PHP returns an array with key values ​​flipped PHP returns an array with key values ​​flipped Mar 21, 2024 pm 02:10 PM

This article will explain in detail how PHP returns an array after key value flipping. The editor thinks it is quite practical, so I share it with you as a reference. I hope you can gain something after reading this article. PHP Key Value Flip Array Key value flip is an operation on an array that swaps the keys and values ​​in the array to generate a new array with the original key as the value and the original value as the key. Implementation method In PHP, you can perform key-value flipping of an array through the following methods: array_flip() function: The array_flip() function is specially used for key-value flipping operations. It receives an array as argument and returns a new array with the keys and values ​​swapped. $original_array=[

How to use PHP explode function and solve errors How to use PHP explode function and solve errors Mar 10, 2024 am 09:18 AM

The explode function in PHP is a function used to split a string into an array. It is very common and flexible. In the process of using the explode function, we often encounter some errors and problems. This article will introduce the basic usage of the explode function and provide some methods to solve the error reports. 1. Basic usage of the explode function In PHP, the basic syntax of the explode function is as follows: explode(string$separator,string$stri

Common errors and solutions when using the explode function in PHP Common errors and solutions when using the explode function in PHP Mar 11, 2024 am 08:33 AM

Title: Common errors and solutions when using the explode function in PHP In PHP, the explode function is a common function used to split a string into an array. However, some common errors can occur due to improper use or incorrect data format. This article will analyze the problems you may encounter when using the explode function, and provide solutions and specific code examples. Mistake 1: The delimiter parameter is not passed in. When using the explode function, one of the most common mistakes is that the delimiter parameter is not passed in.

Split and merge strings using the explode and implode functions Split and merge strings using the explode and implode functions Jun 15, 2023 pm 08:42 PM

In PHP programming, processing strings is a frequently required operation. Among them, splitting and merging strings are two common requirements. In order to perform these operations more conveniently, PHP provides two very practical functions, namely the explode and implode functions. This article will introduce the usage of these two functions, as well as some practical skills. 1. The explode function The explode function is used to split a string according to the specified delimiter and return an array. Its function prototype is as follows: arra

PHP returns the current element in an array PHP returns the current element in an array Mar 21, 2024 pm 12:36 PM

This article will explain in detail about the current element in the array returned by PHP. The editor thinks it is very practical, so I share it with you as a reference. I hope you can gain something after reading this article. Get the current element in a PHP array PHP provides a variety of methods for accessing and manipulating arrays, including getting the current element in an array. The following introduces several commonly used techniques: 1. current() function The current() function returns the element currently pointed to by the internal pointer of the array. The pointer initially points to the first element of the array. Use the following syntax: $currentElement=current($array);2.key() function key() function returns the array internal pointer currently pointing to the element

What is the difference between foreach and for loop What is the difference between foreach and for loop Jan 05, 2023 pm 04:26 PM

Difference: 1. for loops through each data element through the index, while forEach loops through the data elements of the array through the JS underlying program; 2. for can terminate the execution of the loop through the break keyword, but forEach cannot; 3. for can control the execution of the loop by controlling the value of the loop variable, but forEach cannot; 4. for can call loop variables outside the loop, but forEach cannot call loop variables outside the loop; 5. The execution efficiency of for is higher than forEach.

See all articles