`
OrangeHolic
  • 浏览: 260896 次
  • 来自: 北京
社区版块
存档分类
最新评论

深入PHP-直观观察array的扩展

    博客分类:
  • PHP
 
阅读更多
        皆知PHP的数组是由HashTable和双链表实现的,为了方便大家查看数组的数据结构,开发一个遍历PHP的数组生成Dot描述的PHP插件,生成dot描述以后可以通过一些渲染工具生成图像,本例用的是 Graphviz。
        扩展的实现很简单,PHP数组源码是由下面的两种结构体实现的,扩展就是将这两种结构体和各个结构体的关系遍历一遍,生成对应的Dot描述即可。
typedef struct bucket {
     ulong h;                         
     uint nKeyLength;
     void * pData;
     void * pDataPtr;
     struct bucket * pListNext;
     struct bucket * pListLast;
     struct bucket *pNext ;
     struct bucket * pLast;
     const char *arKey ;
} Bucket;

typedef struct _hashtable {
     uint nTableSize;
     uint nTableMask;
     uint nNumOfElements;
     ulong nNextFreeElement;
     Bucket *pInternalPointer;    
     Bucket *pListHead;
     Bucket *pListTail;
     Bucket **arBuckets;
     dtor_func_t pDestructor;
     zend_bool persistent;
     unsigned char nApplyCount ;
     zend_bool bApplyProtection;
} HashTable;
 



扩展里边函数说明
---------------------------------------------------------------------------------------------
string    dotarray( array $input [, int $flag] )
生成数组数据结构的dot描述
参数
input   需要操作的数组
flag   查看那些数据结构,是扩展提供的3个常量或操作,分别是
     DOTARAAY_HASH_TABLE 表示显示HashTable结构
     DOTARRAY_DOUBLE_LIST 显示数组的双链表结构
     DOTARRAY_CURRENT_POSITION 显示数组现在的内部指针的位置
返回值
成功返回dot描述字符串,错误(非数组等情况)返回false
---------------------------------------------------------------------------------------------
显示双链表结构例子

<?php

$items = array(1,2,8=>'lalala',16=>'hahaha','name'=>'shiki',30=>'wooooo...');
next($items);/*将内部指针移到下一位*/
$result = dotarray($items,DOTARRAY_DOUBLE_LIST|DOTARRAY_CURRENT_POSITION);
echo  $result;

得到的dot描述:

digraph html {label = "Structure of array";
node[shape = record];
===========部分内容省略============
edge [color=black];
edge [color=green];
sk_array:f5:s -> sk_item_1:f0;
edge [color=black];
}

通过graphviz渲染得到下面的图片




需要解释一下,红色实线为结构中双链表的next指针,红色点线为上一个元素指针。同时提供了DOTARRAY_CURRENT_POSITION标志,出现绿线指向数组内部指针指向key为1的元素(第一个元素key为0)

显示HashTable结构例子

<?php

$items = array(1,2,8=>'lalala',16=>'hahaha','name'=>'shiki',30=>'wooooo...');
next($items);
next($items);
$result = dotarray($items,DOTARAAY_HASH_TABLE|DOTARRAY_CURRENT_POSITION);
echo $result;

生成的结构图片如下:



hash冲突的例子
       具体可以参考 PHP hash碰撞拒绝服务漏洞原理http://www.laruence.com/2011/12/29/2412.html,简单介绍即是:Hash表因为”冲突”(碰撞)而退化成链表,如果数据量足够大, 使得php在计算, 查找, 插入的时候, 造成大量的CPU占用, 从而实现拒绝服务攻击。下面是简单的碰撞生成代码:

<
?php

/*会生出pow(2,$n)个数字*/
$n= 3;
$capacity = pow(2,$n);
$array =array();
for($i=0;$i<$capacity;$i++){
    $key = $i<<$n;
    $array[$key] =1;
}


$str = dotarray($array,DOTARRAY_DOUBLE_LIST|DOTARAAY_HASH_TABLE);
echo $str,PHP_EOL;

这次将hashtable和双线表同时展示出来,传递的flag为DOTARRAY_DOUBLE_LIST|DOTARAAY_HASH_TABLE,同时展示双链表和HashTable



关于 dot语言 传送门:http://zh.wikipedia.org/wiki/DOT%E8%AF%AD%E8%A8%80
关于 dot渲染工具Graphviz 传送门:http://www.graphviz.org/
  • 大小: 45.1 KB
  • 大小: 40.7 KB
  • 大小: 82.5 KB
分享到:
评论

相关推荐

    php-7.3.7.tar.gz

    《PHP 7.3.7:深入理解与应用》 PHP(PHP:Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,尤其适用于Web开发,并可嵌入到HTML中。PHP 7.3.7是PHP的一个稳定版本,为开发者提供了更高效、更强大的...

    Laravel开发-blade-extensions

    - 在某些情况下,可能需要在模板中创建多行数组,自定义的`array`扩展可以简化这个过程,使得在视图中创建和操作数组更加直观。 7. **应用与实践**: - 自定义Blade扩展的一个常见用途是在不修改后端代码的情况下...

    Laravel开发-laravel-postgres-extended-schema

    $table-&gt;integer('array_field')-&gt;array(); }); ``` 此外,PostgreSQL还支持枚举类型,这在处理预定义值集合时非常有用。`laravel-postgres-extended-schema` 允许你在Laravel中创建和使用枚举类型: ```php $...

    细说PHP(第二版) 配套源码 4-17

    《细说PHP》是针对PHP编程语言的一本深入解析教程,第二版于2012年10月出版。本书旨在帮助读者全面理解和掌握PHP语言,涵盖了从基础语法到高级特性的广泛内容。通过配套的源码,读者可以更直观地理解书中所讲述的...

    phpQuery下载

    **phpQuery详解** phpQuery是基于PHP开发的一个强大的网页解析库,它的设计灵感来源于JavaScript库jQuery,因此在使用上...通过深入理解和熟练使用phpQuery,可以大大提高PHP项目中与HTML处理相关的部分的工作效率。

    php7.3.8中文手册2019.rar

    1. FFI(Foreign Function Interface):PHP 7.3引入了FFI,允许PHP直接调用C库,这极大地扩展了PHP的功能,使得在PHP中使用C库变得更加便捷。 2. 算法和函数增强: - `array_key_first()` 和 `array_key_last()` ...

    php设计模式demo

    本文将深入探讨PHP设计模式的几个重要方面,以及如何通过示例代码`demo0707`来理解它们。 一、单例模式(Singleton) 单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象,...

    PHP新手上路中文教程

    通过深入学习并实践这些知识点,你将能够熟练掌握PHP编程,为你的Web开发生涯打下坚实的基础。同时,不要忘记查阅官方文档,参与社区讨论,以及不断实践以提升自己的技能。祝你在PHP的世界里一路顺风!

    仿Thinkphp的数据库类,超级好用,一个php文件

    这看起来是基于链式操作的,非常直观且易于理解。`M('users')`可能是用来实例化数据库操作类,并指定要操作的表为“users”。`where(array('id'=&gt;8'))`设置了查询条件,即id为8的记录。最后,`select()`方法执行SQL...

    php5.6版本

    在数组操作上,PHP5.6提供了新的语法糖,如`list()`, `[]`操作符的使用更加便捷,这使得创建和处理数组变得更加直观。另外,`array_column()`函数的添加,使得从二维数组中提取特定列的数据变得简单。 在安全方面,...

    PHP中文手册(2011-11-18更新) Html

    手册以HTML格式呈现,方便用户在本地环境中离线浏览,无论是作为开发过程中的即时查询工具,还是深入学习PHP的教材,都非常实用。 PHP(Hypertext Preprocessor,超文本预处理器)是一种广泛应用于Web开发的开源...

    PHP编程一百例(2)

    5. 数组操作:PHP提供了丰富的数组函数,如array_push、array_pop、array_search等,用于处理和操作数组元素。 6. 文件操作:包括读取、写入、复制和删除文件,以及处理目录。这些实例有助于理解文件系统交互。 7....

    php 5 in practice(Book and Code)

    《PHP 5 in Practice》是一本专为PHP开发者编写的实战指南,旨在帮助读者深入理解PHP 5的各种特性和最佳实践。这本书结合了理论与实际案例,提供了丰富的代码示例,帮助开发者提升技能并解决实际问题。源码与书籍的...

    php报表简介

    在PHP应用程序中,报表是至关重要的,它们帮助开发者和用户以直观的方式理解和分析数据。本篇文章将深入探讨PHP报表的原理、设计方法以及相关技术。 首先,了解PHP报表的基本概念。PHP报表主要是通过连接数据库,...

    《PHP网站开发实例教程》源代码.zip

    《PHP网站开发实例教程》是一本深入浅出的教材,旨在教授读者如何使用PHP语言进行网站开发。源代码是本书教学内容的实践部分,通过分析和运行这些代码,读者能够更直观地理解PHP编程原理和实际应用。在这个压缩包中...

    类似php的js数组的in_array函数自定义方法

    因此,为了实现类似PHP的`in_array`功能,我们可以自定义一个方法来扩展JavaScript的Array原型。以下就是如何自定义`in_array`函数的几种方法: **方法1:基础循环检查** 这是最直观和基础的实现方式,通过遍历...

    PHP 数组的特殊操作

    IDE(集成开发环境)如PHPStorm或Visual Studio Code的扩展插件也能提供更直观的数组查看和编辑功能。 在实际项目中,我们还可能需要用到序列化和反序列化数组。`serialize()`和`unserialize()`函数可以将数组转换...

    PHP编程的几十个例子 (附图片+源码)

    本文将围绕"PHP编程的几十个例子 (附图片+源码)"这个主题,深入探讨PHP5与MySQL开发技术中的关键知识点。 首先,PHP5是PHP语言的一个重要版本,它引入了许多新特性和改进,比如对象模型的增强、错误处理机制的改进...

    三天学会PHP——第一天

    - 视频教程:[三天学会PHP]第一天视频.rar,提供直观的讲解,帮助理解和记忆。 - 课件资料:[三天学会PHP]第一天课件.rar,包含详细的文字说明和示例代码,供查阅和复习。 - 实践练习:[三天学会PHP]第一天作业.rar...

Global site tag (gtag.js) - Google Analytics