Table of Contents
Definition and generation method of PHP barcode " >Definition and generation method of PHP barcode
Home Backend Development PHP Tutorial Implementation skills of php unordered tree

Implementation skills of php unordered tree

Jun 08, 2018 pm 03:17 PM
php

This article mainly introduces the implementation skills of PHP unordered tree. Interested friends can refer to it. I hope it will be helpful to everyone.

The example in this article describes the implementation method of PHP unordered tree, the details are as follows:

The running effect is shown in the figure below:

php code As follows:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

<?php

/*

用php写的无序树

 */

 class unorderedTree{

 // 节点id计数器

 protected $nodeId=0;

 // 树的深度

 protected $depth=0;

 // 树的节点数,

 protected $nodesCount=0;

 // 树的度 @todo: 使其发挥作用

 public $degree=" to be implent";

 // 根节点id

 // 由于树有多种从根节点开始操作,不想每次遍历树到顶找root,用一个变量始终指向根节点

 protected $rootid=null;

 // 子节点集合, k-v 为 nodeid=>(stdclass)node

 // 一些树的实现常常是采用节点和树同一class,这里节点是使用 stdclass{ data, parent, id , childrenIds} ,因我认为节点和树应为两种对象,且stdclass要轻于树的class

 // 节点格式说明: $this->nodes[nodeId] = new stdclass{ id ,parentId, childrenIds, data }

 // id: 节点id

 // parentId: 节点父节点id

 // childrenIds: 子节点的id 不想每次遍历树确定层次关系

 // 注意: 节点中, #只保存其自身数据和其子节点id的集合#, 子节点的数据通过从树 $tree->nodes[ $node->childrenIds[a_child_id] ] 访问

 // data: 节点中包含的数据,如节点名称等属性数据

 protected $nodes=array();

 // 用户自定义访问节点

 protected $userVisitFunction=null;

 /* 分组: 类的基本函数 */

 // @todo: 构造树

 public function __construct(){

 }

 // @todo: 销毁树

 public function __destruct(){

  unset($this->nodes) ;

 }

  //------------ 获取数据类函数---------------

  // 获取树的深度,

  public function getTreeDepth(){

  return $this->depth;

  }

  // 获取树的节点数目

  public function getCount(){

  return $this->NodesCount;

  }

  // 获取树的度

  public function getDegree(){

  // @todo: 获取树的度(因为对度暂时没什么需要就不实现了 )

  return $this->degree;

  }

  //获取指定节点

  public function getNode($nodeId){

  if(isset($this->Nodes[$nodeId])){

   return $this->Nodes[$nodeId];

  }

  else{

   return false;

  }

  }

  // 获取最新id

  public function getId(){

  return $this->nodeId;

  }

  //获取指定节点高度

  public function getNodeHeight($nodeId){

  if( array_key_exists($nodeId, $this->nodes) ){

   // 此节点已在树里,高度至少为1,每找到一个父节点+1

   $height=1;

   // 记录此树中已经访问过的节点, 用于防止节点构造时互相parent导致此函数死循环且及时结束查找

   $visitedNodesIds=array();

   // 记录当前操作节点的id

   $cid=$nodeId;

   // 当前节点的父节点必须存在于此树中

   // 不用递归

   while( isset($cid) ) {

    if( !in_array($cid,$visitedNodesIds ) ){

     if( $this->rootid===$cid){ //到顶,返回

      return $height;

     }

     $visitedNodesIds[]=$cid;

     $cid= $this->nodes[ $cid ]->parentId;

     $height++;

    }

    else{

     return false;

    }

   }

   return false;

  }

  else{

   return false;

  }

  }

  //获取根节点

  public function getRoot(){

  return (!is_null($this->rootid) ) && $this->nodes[$this->rootid];

  }

  //获取指定节点和其所有子节点构成的数组

  //这是用于获取子树的一个关键基础操作

  public function getSubNodes($nodeId){

  if(isset($this->nodes[$nodeId])){

   $result=array();

   $toVisitNodeIds=array();

   $toVisitedNodeIds[]=$nodeId;

   $result[]=$this->nodes[$nodeId]->id;

   array_shift($toVisitedNodeIds);

   $toVisitedNodeIds=array_merge( $toVisitedNodeIds, $this->nodes[$nodeId]->childrenIds);

   while(!empty($toVisitedNodeIds)){

    $toVisitNodeId=array_shift($toVisitedNodeIds);

    $result[]=$this->nodes[$toVisitNodeId]->id;

    $toVisitedNodeIds=array_merge( $toVisitedNodeIds, $this->nodes[$toVisitNodeId]->childrenIds);

   }

   return $result ;

  }

  else{

   return false;

  }

  }

  //@todo: 获取由指定节点和其所有子节点构建的子树

  public function getSubTree($nodeid){

  }

  //---------------- 数据更新 -----------------

  public function setId($nodeId){

   $this->nodeId=$nodeId;

   return $this;

  }

  // 创建不重复的(树中未被使用的) 新id

  public function seekId(){

  $this->nodeId++;

  return $this->nodeId;

  }

 public function setVisitFunction($userFunction){

  $this->userVisitFunction=$userFunction;

  }

  //插入子节点,默认为插在根节点下

  public function insertNode($parent_id=null , $data=null){

  //注意node不是class tree

  $node = new stdclass;

  $node->data = $data;

  //树的节点数增加

  $this->nodeCount++;

  // 分配节点id

  $this->seekId();

  $node->id =$this->getId();

  //插入根节点

  if( (is_null($parent_id)) && is_null($this->rootid)){

   $node->parentId = null;

   $node->childrenIds = array();

   $this->depth=1;

   $this->rootid=$node->id;

   $this->nodes [$node->id]=$node;

   return $this;

  }

  elseif( isset($this->nodes[$parent_id]) || is_null($parent_id) ){

  // 插在此树已有节点下

   if(is_null($parent_id)){

    $parent_id=$this->rootid;

   }

   $node->parentId = $parent_id;

   $node->childrenIds = array();

   //更新树的最大深度

   $depth=$this->getNodeHeight($parent_id);

   $this->depth=max($depth+1, $this->depth);

   $this->nodes[$parent_id]->childrenIds []= $node->id;

   $this->nodes [$node->id]=$node;

   return $this;

  }

  else{

   return $this;

  }

  }

  //insert node 的别名

  public function append($parent_id=null , $data=null){

  return $this->insertNode($parent_id,$data);

  }

  // --------------- 数据访问 -----

  //广度优先遍历节点的别名, 全名太长了

  public function b($nodeId=null){

  return $this->breadthTraversal($nodeId);

  }

  // 广度优先遍历节点

  public function breadthTraversal($nodeId=null){

  if(is_null($this->rootid)){

   die("此树为空树,不可访问");

  }

  else{

   //全部遍历

   if(is_null($nodeId) || ( $this->rootid===$nodeId) ){

    $nodeId=$this->rootid;

   }

   $toVisitNodeIds=array();

   $toVisitedNodeIds[]=$nodeId;

   $this->visit( $this->nodes[$nodeId]);

   array_shift($toVisitedNodeIds);

   $toVisitedNodeIds=array_merge( $toVisitedNodeIds, $this->nodes[$nodeId]->childrenIds);

   while(!empty($toVisitedNodeIds)){

    $toVisitNodeId=array_shift($toVisitedNodeIds);

    $this->visit( $this->nodes[$toVisitNodeId]);

    $toVisitedNodeIds=array_merge( $toVisitedNodeIds, $this->nodes[$toVisitNodeId]->childrenIds);

   }

  }

  return $this;

  }

  //深度优先的别名

  public function d($nodeId=null){

  return $this->depthTraversall($nodeId);

  }

  // 深度优先遍历

  // 和广度优先的不同实现只在于array_merge的顺序不同而已 ( php array 忒好用啊忒好用 )

  public function depthTraversall($nodeId=null){

  if(is_null($this->rootid)){

   die("此树为空树,不可访问");

  }

  else{

   //全部遍历

   if(is_null($nodeId)){

    $nodeId=$this->rootid;

   }

   $toVisitNodeIds=array();

   $toVisitedNodeIds[]=$nodeId;

   $this->visit( $this->nodes[$nodeId]);

   array_shift($toVisitedNodeIds);

   $toVisitedNodeIds=array_merge( $this->nodes[$nodeId]->childrenIds, $toVisitedNodeIds );

   while(!empty($toVisitedNodeIds)){

    $toVisitNodeId=array_shift($toVisitedNodeIds);

    $this->visit( $this->nodes[$toVisitNodeId]);

    $toVisitedNodeIds=array_merge( $this->nodes[$toVisitNodeId]->childrenIds, $toVisitedNodeIds );

   }

  }

  return $this;

  }

  //访问单个节点

  public function visit($node){

  if(is_null($this->userVisitFunction )){

   return $node->id;

  }

  else{

   return call_user_func($this->userVisitFunction,$node,$this);

  }

  }

 }

?>

Copy after login

Summary: The above is the entire content of this article, I hope it will be helpful to everyone's study.

Related recommendations:

Basic knowledge and application of PHP design patterns

Definition and generation method of PHP barcode

Several methods for php to determine and obtain file extensions

The above is the detailed content of Implementation skills of php unordered tree. For more information, please follow other related articles on the PHP Chinese website!

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

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

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)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

See all articles