在强类型的变成语言中,有专用的数据结构解决方案。通常都是创建一个容器,在这个容器中可以存储任意类型的数据,并且可以根据容器中存储的数据决定容器的容量,达到可以变长的容器结构,比如链表、堆栈及队列等都是数据结构中常用的形式。在PHP中,通常都是使用数组来完成其他语言使用数据结构才能完成的工作。它是弱类型语言,在同一个数组中就可以存储多种类型的数据,而且PHP中的数组没有长度限制,数组存储数据的容量还可以根据里面元素个数的增减自动调整。
一、使用数组实现堆栈
堆栈是数据结构的一种实现形式,是一种使用非常广泛的存储数据的容器。在堆栈这种容器中,最后压入的数据(进桟),将会被最先弹出(出栈)。即在数据存储时采用“先进后出”的数据结构。在PHP中,将数组当做一个栈,使用array_push()和array_pop()两个系统函数即可完成数据的进桟和出栈操作。
①函数array_push()
array_push()函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。该函数等于多次调用$array[]=$value。其函数的原型如下:
int array_push(array &array ,mixed var [,mixed...])
该函数的第一个参数是必选的,作为栈容器的一个数组。第二个参数也是必选的,在第一个参数中的数组尾部添加的一个数据。还可以有多个可选参数,都可以添加到第一个参数的数组中的尾部,即入栈。但需要注意即使数组中有字符串键名,添加的元素也始终是数字键。函数array_push()使用的代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php $a = array ( "Dog" , "Cat" ); array_push ( $a , "Horse" , "Bird" ); print_r( $a ); //输出Array ( [0] => Dog [1] => Cat [2] => Horse [3] => Bird ) //带有字符串键的数组: $a = array ( "a" => "Dog" , "b" => "Cat" ); array_push ( $a , "Horse" , "Bird" ); print_r( $a ); //输出Array ( [a] => Dog [b] => Cat [0] => Horse [1] => Bird ) //使用array_push()函数和使用这种直接赋值初始化数组的方式是一样的 $lamp [ "web" ]= "www" ; print_r( $a ) //输出Array ( [a] => Dog [b] => Cat [0] => Horse [1] => Bird [web]=> www) ?> |
如果用array_push()来给数组添加一个单元,还不如用“$array[]=$value”形式,因为这样没有调用函数的额外负担,而且使用后者还可以添加键值是字符串的关联数组。如果第一个参数不是数组,array_push()将发出一条警告。这和“$array[]=$value”的行为不同,后者会新建一个数组。
②array_pop(array &array)
array_pop函数删除数组中的最后一个元素,即将数组最后一个单元弹出(出栈),并将数组的长度减1,如果数组为空(或者不是数组)将返回NULL。其函数的原型如下:
mixed array_pop(array &array)
该函数只有一个参数,即作为栈的数据。返回弹出的数组中最后一个元素的值。函数array_pop()使用的代码如下所示:
1
2
3
4
5
6
7
|
<?php //声明一个数组作为栈 $lamp = array ( "Linux" , "Apache" , "MySQL" , "PHP" ); array_pop ( $lamp ); print_r( $lamp ) //输出 array([0]=>Linux [1]=>Apache [2]=>MySQL) ?> |
二、使用数组实现队列
PHP中的数组处理函数还可以使用数组实现队列的操作。堆栈是“后进先出”原则,而一个队列则允许在一端插入数据,在另一端删除数据,也就是实现最先进入队列的数据最先退出队列,就像银行的排号机,最先排好的号最先办理业务。即队列是“先进先出”的原则。
使用array_push()和array_pop()函数都是从数组的最后添加数据和删除数据,如果使用array_push()函数在数组的最后添加数据,而将数组中第一个元素删除就可以实现一个队列。
③函数array_shift()
函数array_shift()可以实现删除数组中的第一个元素,并返回被删除元素的值。其函数的原型如下:
mixed array_shift(array &array)
该函数和array_pop()函数一样,都是只有一个必选参数,其参数为实现队列的数组。将数组中第一个单元移出并作为结果返回,将数组的长度减1,还将所有其他元素向前移动一位。所有的数字键名将改为从0开始计数,字符串键名将保持不变。如果数组为空(或者不是数组),则返回NULL。函数array_shift()使用的代码如下所示:
1
2
3
4
5
6
7
8
9
10
|
<?php //带有字符串键值的关联数组 $lamp = array ( "a" => "Linux" , "b" => "Apache" , "c" => "MySQL" , "d" => "PHP" ); array_shift ( $lamp ); print_r( $lamp ); //输出:Array([b]=>Apache [c]=>MySQL [d]=>PHP) $lamp = array ( "Linux" , "Apache" , "MySQL" , "PHP" ); array_shift ( $lamp ); print_r( $lamp ); //数字下标重新索引Array([0]=>Apache [1]=>MySQL [2]=>PHP) ?> |
④函数array_unshift()
在PHP中海可以使用array_unshift()函数在队列数组的开头插入一个或多个元素,该函数执行成功将返回插入元素个数,使用格式和函数array_push()是一样的。通过前面介绍的这4个函数从而实现了从数组的任意一端添加和删除数据。