本文实例讲述了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程序设计有所帮助。

Jenis PHP meminta untuk meningkatkan kualiti kod dan kebolehbacaan. 1) Petua Jenis Skalar: Oleh kerana Php7.0, jenis data asas dibenarkan untuk ditentukan dalam parameter fungsi, seperti INT, Float, dan lain -lain. 2) Return Type Prompt: Pastikan konsistensi jenis nilai pulangan fungsi. 3) Jenis Kesatuan Prompt: Oleh kerana Php8.0, pelbagai jenis dibenarkan untuk ditentukan dalam parameter fungsi atau nilai pulangan. 4) Prompt jenis yang boleh dibatalkan: membolehkan untuk memasukkan nilai null dan mengendalikan fungsi yang boleh mengembalikan nilai null.

Dalam PHP, gunakan kata kunci klon untuk membuat salinan objek dan menyesuaikan tingkah laku pengklonan melalui kaedah Magic \ _ _ _. 1. Gunakan kata kunci klon untuk membuat salinan cetek, mengkloning sifat objek tetapi bukan sifat objek. 2. Kaedah klon \ _ \ _ boleh menyalin objek bersarang untuk mengelakkan masalah menyalin cetek. 3. Beri perhatian untuk mengelakkan rujukan pekeliling dan masalah prestasi dalam pengklonan, dan mengoptimumkan operasi pengklonan untuk meningkatkan kecekapan.

PHP sesuai untuk pembangunan web dan sistem pengurusan kandungan, dan Python sesuai untuk sains data, pembelajaran mesin dan skrip automasi. 1.PHP berfungsi dengan baik dalam membina laman web dan aplikasi yang cepat dan berskala dan biasanya digunakan dalam CMS seperti WordPress. 2. Python telah melakukan yang luar biasa dalam bidang sains data dan pembelajaran mesin, dengan perpustakaan yang kaya seperti numpy dan tensorflow.

Pemain utama dalam tajuk cache HTTP termasuk kawalan cache, ETAG, dan modifikasi terakhir. 1.Cache-Control digunakan untuk mengawal dasar caching. Contoh: Cache-Control: Max-Age = 3600, Awam. 2. ETAG mengesahkan perubahan sumber melalui pengenal unik, Contoh: ETAG: "686897696A7C876B7E". 3. Modified Last Menunjukkan Masa Pengubahsuaian Terakhir Sumber, Contoh: Modified Last: Wed, 21OCT201507: 28: 00GMT.

Dalam php, kata laluan_hash dan kata laluan 1) password_hash menjana hash yang mengandungi nilai garam untuk meningkatkan keselamatan. 2) Kata Laluan_verify Sahkan kata laluan dan pastikan keselamatan dengan membandingkan nilai hash. 3) MD5 dan SHA1 terdedah dan kekurangan nilai garam, dan tidak sesuai untuk keselamatan kata laluan moden.

PHP adalah bahasa skrip sisi pelayan yang digunakan untuk pembangunan web dinamik dan aplikasi sisi pelayan. 1.Php adalah bahasa yang ditafsirkan yang tidak memerlukan kompilasi dan sesuai untuk perkembangan pesat. 2. Kod PHP tertanam dalam HTML, menjadikannya mudah untuk membangunkan laman web. 3. PHP memproses logik sisi pelayan, menghasilkan output HTML, dan menyokong interaksi pengguna dan pemprosesan data. 4. PHP boleh berinteraksi dengan pangkalan data, penyerahan borang proses, dan melaksanakan tugas-tugas sampingan pelayan.

PHP telah membentuk rangkaian sejak beberapa dekad yang lalu dan akan terus memainkan peranan penting dalam pembangunan web. 1) PHP berasal pada tahun 1994 dan telah menjadi pilihan pertama bagi pemaju kerana kemudahan penggunaannya dan integrasi lancar dengan MySQL. 2) Fungsi terasnya termasuk menghasilkan kandungan dinamik dan mengintegrasikan dengan pangkalan data, yang membolehkan laman web dikemas kini secara real time dan dipaparkan secara peribadi. 3) Aplikasi dan ekosistem PHP yang luas telah mendorong kesan jangka panjangnya, tetapi ia juga menghadapi kemas kini versi dan cabaran keselamatan. 4) Penambahbaikan prestasi dalam beberapa tahun kebelakangan ini, seperti pembebasan Php7, membolehkannya bersaing dengan bahasa moden. 5) Pada masa akan datang, PHP perlu menangani cabaran baru seperti kontena dan microservices, tetapi fleksibiliti dan komuniti aktif menjadikannya boleh disesuaikan.

Manfaat utama PHP termasuk kemudahan pembelajaran, sokongan pembangunan web yang kukuh, perpustakaan dan kerangka yang kaya, prestasi tinggi dan skalabilitas, keserasian silang platform, dan keberkesanan kos. 1) mudah dipelajari dan digunakan, sesuai untuk pemula; 2) integrasi yang baik dengan pelayan web dan menyokong pelbagai pangkalan data; 3) mempunyai rangka kerja yang kuat seperti Laravel; 4) Prestasi tinggi dapat dicapai melalui pengoptimuman; 5) menyokong pelbagai sistem operasi; 6) Sumber terbuka untuk mengurangkan kos pembangunan.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Versi Mac WebStorm
Alat pembangunan JavaScript yang berguna

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

SublimeText3 versi Inggeris
Disyorkan: Versi Win, menyokong gesaan kod!

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa