php实现的树形结构数据存取类实例
这篇文章主要介绍了php实现的树形结构数据存取类,实例演示了以树形数据结构存取数据的实现方法,对于学习基于PHP的数据结构有一定的参考借鉴价值,需要的朋友可以
本文实例讲述了php实现的树形结构数据存取类。分享给大家供大家参考。
具体实现代码如下:
复制代码 代码如下:
/**
* Tanphp framework
*
*
* @category Tanphp
* @package Data_structure
* @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 (!emptyempty($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;
}
}
?>
希望本文所述对大家的PHP程序设计有所帮助。

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

CakePHP ist ein Open-Source-Framework für PHP. Es soll die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich vereinfachen. CakePHP basiert auf einer MVC-ähnlichen Architektur, die sowohl leistungsstark als auch leicht zu verstehen ist. Modelle, Ansichten und Controller gu

Um am Datei-Upload zu arbeiten, verwenden wir den Formular-Helfer. Hier ist ein Beispiel für den Datei-Upload.

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

CakePHP ist ein Open-Source-MVC-Framework. Es erleichtert die Entwicklung, Bereitstellung und Wartung von Anwendungen erheblich. CakePHP verfügt über eine Reihe von Bibliotheken, um die Überlastung der häufigsten Aufgaben zu reduzieren.

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.
