php数组的数据结构 php数组的概念

php中数组的分类有哪两种?1、索引数组
有两种创建索引数组的方法:
索引是自动分配的(索引从 0 开始):
$cars=array("porsche","BMW","Volvo");
2、关联数组
关联数组是使用您分配给数组的指定键的数组 。
有两种创建关联数组的方法:
$age=array("Bill"="35","Steve"="37","Elon"="43");
扩展资料
实用函数——
有相当多的实用函数作用于数组,参见数组函数一节 。
注: unset() 函数允许取消一个数组中的键名 。要注意数组将不会重建索引 。
?php
$a = array( 1 = 'one', 2 = 'two', 3 = 'three' );
unset( $a[2] );
/* 将产生一个数组,定义为
$a = array( 1='one', 3='three');
而不是
$a = array( 1 = 'one', 2 = 'three');
*/
$b = array_values($a);
// Now $b is array(0 = 'one', 1 ='three')
?
foreach 控制结构是专门用于数组的 。它提供了一个简单的方法来遍历数组 。
PHP 数组的底层实现PHP 数组的底层主要是通过 HashTable 实现,HashTable 通过映射函数或者散列函数将 String Key 转换成一个普通的数字下标 , 然后再将 Value 值存储到下标对应的数组元素中
HashTable 主要包含两部分:1.存储元素的数组 2.散列函数或者映射函数
随机访问
如果我们指定一个 Key=Value 的映射关系,Key 是一个 String 类型的,则先通过 Time 33 算法将 String 转换成一个 Int 整型,然后再通过 PHP 里面特定的散列算法映射成 Bucket 数组中的一个下标,将 Value 值存储到对应的下标元素中,当我们通过 Key 访问数组元素时 , 只需要再通过相同的算法计算出对应的 Key,就能实现随机访问数组元素
顺序访问
存储在 HashTable 中的数组是无序的,但是 PHP 中的数组是有序的,为了实现 HashTable 的有序性 , PHP 引入了一个中间映射表,该表是一个大小和 Bucket 数组相同的数组,数组中存放的是整形数据,主要用于存放元素实际存储的 Value 的下标值 , 当引入中间映射表之后,Bucket 中的数据是有序的,而中间映射表中的数据是无序的,当我们顺序访问的时候只需要遍历 Bucket 中的数据即可
Hash 冲突
PHP 解决 Hash 冲突采用的是链地址法 , 将出现冲突的 Bucket 串成链表,这样通过中间映射表映射出来的就不再是一个元素而是一个链表,通过散列函数定位到对应的 Bucket 链表时,需要遍历链表 , 逐个对比 key 值,直至找出对应的目标值
PHP 实现扩容
1.当删除的元素所占比例超出阈值的时候,则需要移除已经被逻辑删除的 Bucket,将后面的 Bucket 补位到前面 , 因为 Bucket 的下标发生了变动,所以需要更新每元素在中间映射表中实际存储的下标值
2.当没有超出阈值的时候,PHP 会申请一个大小是原来两倍的新数组,并将旧数组中的数据复制到新数组中 , 因为数组长度发生了变化,所以 key-value 的映射关系需要重新计算,这个就是重建索引
PHP一个数组第一个元素判断""如何判断是该数组的第一个元素则执行的语句"",“如果是数组的第一个元素”
这样描述缺主语,‘判断是该数组’谁是第一个,谁和第一个比较?
假设题意是为了某变量$n和数组首个比较 。PHP的数组也是一种特殊的数据结构 , 光说‘第一个元素’都有2种情况 。
$a=Array ( [0] = 10 [1] = 6 [2] = 8 ……
写法1
if($n===current($a)) //是数组内部指针序列的第一个元素
写法2
if($n===$a[0]) //是数组键引索的第一个元素
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例队列这种数据结构更简单,就像我们生活中排队一样,它的特性是先进先出(FIFO) 。
PHP
SPL中SplQueue类就是实现队列操作,和栈一样,它也可以继承双链表(SplDoublyLinkedList)轻松实现 。
SplQueue类摘要如下:
SplQueue简单使用如下:
复制代码
代码如下:
$queue
=
new
SplQueue();
/**
*
可见队列和双链表的区别就是IteratorMode改变了而已,栈的IteratorMode只能为:
*
(1)SplDoublyLinkedList::IT_MODE_FIFO
|
SplDoublyLinkedList::IT_MODE_KEEP
(默认值,迭代后数据保存)
*
(2)SplDoublyLinkedList::IT_MODE_FIFO
|
SplDoublyLinkedList::IT_MODE_DELETE
(迭代后数据删除)
*/
$queue-setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO
|
SplDoublyLinkedList::IT_MODE_DELETE);
//SplQueue::enqueue()其实就是
SplDoublyLinkedList::push()
$queue-enqueue('a');
$queue-enqueue('b');
$queue-enqueue('c');
//SplQueue::dequeue()其实就是
SplDoublyLinkedList::shift()
print_r($queue-dequeue());
foreach($queue
as
$item)
{
echo
$item
.
PHP_EOL;
}
print_r($queue);
而优先队列SplPriorityQueue是基于堆(后文介绍)实现的 。
SplPriorityQueue的类摘要如下:
SplPriorityQueue简单使用:
$pq
=
new
SplPriorityQueue();
$pq-insert('a',
10);
$pq-insert('b',
1);
$pq-insert('c',
8);
echo
$pq-count()
.PHP_EOL;
//3
echo
$pq-current()
.
PHP_EOL;
//a
/**
*
设置元素出队模式
*
SplPriorityQueue::EXTR_DATA
仅提取值
*
SplPriorityQueue::EXTR_PRIORITY
仅提取优先级
*
SplPriorityQueue::EXTR_BOTH
提取数组包含值和优先级
*/
$pq-setExtractFlags(SplPriorityQueue::EXTR_DATA);
while($pq-valid())
{
print_r($pq-current());
//a
c
b
$pq-next();
}
【php数组的数据结构 php数组的概念】关于php数组的数据结构和php数组的概念的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

    推荐阅读