本文目录一览:
PHP中用hash实现的数组
PHP中使用最多的非Array莫属了,那Array是如何实现的?在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1.
而其计算字符串hash值的方法如下,将源码摘出来以供查备:
复制代码
代码如下:
static
inline
ulong
zend_inline_hash_func(const
char
*arKey,
uint
nKeyLength)
{
register
ulong
hash
=
5381;
//此处初始值的设置有什么玄机么?
/*
variant
with
the
hash
unrolled
eight
times
*/
for
(;
nKeyLength
=
8;
nKeyLength
-=
8)
{
//这种step=8的方式是为何?
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
//比直接*33要快
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
}
switch
(nKeyLength)
{
case
7:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
//此处是将剩余的字符hash
case
6:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
case
5:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
case
4:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
case
3:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
case
2:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
case
1:
hash
=
((hash
5)
+
hash)
+
*arKey++;
break;
case
0:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
return
hash;//返回hash值
}
ps:对于以下函数,仍有两点不明:
hash
=
5381设置的理由?
这种step=8的循环方式是为了效率么?
php里面怎么新建数组?
php里面新建数据可以通过两种方式,一种是通过array函数来创建,另一种就是通过赋值[]来创建。
?php
$arr1 = array(1,2,3,4);
var_dump($arr1);
$arr2[0] = 1;
$arr2[1] = 2;
$arr2[2] = 3;
$arr2[3] = 4;
var_dump($arr2);
php 如何定义一个数组
php中定义数组的方法:
1、PHP定义数组的格式:
数组名=array();
如:$aa=array();//这样就定义了一个数组,
之后给元素赋值:
$aa[0]="9016";
$aa[1]="9017";
$aa[2]="9018";
2、PHP输出数组的方法:
foreach($aa as $val)
{
echo$val;
}
也可以在定义数组时直接赋值
$aa=array(0="9016",1="9017";2="9018");
3、PHP的数组还可以用字符做下标,不一定要数字:
$aa["name"]="Joan";
$aa["num"]="9018";
$aa["email"]="abc@abc.com";
也可以这样
$aa=array("name"="joan","num"="9018","email"="abc@abc.com");
将一个一维数组的元素也定义为数组,就是一个二维数组,
$aa=array(0="a1",1="a2");
$bb=array(0="b1",1="b2");
$cc=array(0=$aa;1=$bb);此时,$cc[0]也是一个数组,$cc[1]也是一个数组,$cc就是一个二维数组。
同理,三维,四维数组也可以继续定义下去。
4、数组的元素不仅于数字和字符串,可以是类的对象。