PHP中最强悍也最令人佩服的结构应该是PHP中的数组了吧!因为其便捷性,所以被广泛应用到广泛的地方。比如说Yii中的事件列表,行为列表等。
PHP中的数组有两种,一种是数值索引的数组,另一种是字符索引的数组,注意了哦!第一种就不用说了,和其他语言中的数组是一样的,只是具备了一些PHP语言独有的特性而已,比如说数组可以不声明直接使用,数组可以无限扩展元素的容量,当然前提得是内存允许的情况下。字符索引的数组,应该是PHP中所独有的吧!其他语言中也有类似的结构称为Hash表类型。这个也不是问题。假如说,你查看过PHP的原理的一些东西,你就会认识到PHP数组的底层同样是C语言的Hash表,这也就无可厚非了。PHP中的数组拥有了其他语言中的数组和Hash表公有的特性。
数组的声明:
声明比较简单,甚至于可以不用声明。直接使用就可以了。比如说:$a = array(); $a [1] = 20;或者可以略去数组声明,直接使用就像这样:$a[1] = 80;。这两种办法都是可以正常工作的。当然字符索引也是一样的。$k['str'] = ‘hello array’;
数组的遍历:
遍历方式有好几种,for遍历,适用于数字索引的数组。foreach遍历,这个是特意为PHP数组设置的遍历方式可以说是好用之极:
foreach ( $d as $k=>$v) {
echo $k ; echo $v;
}
另外还有一些其他的方式,来遍历数组。数组指针有点儿类似C语言中的指针,指针可以向前或者向后移动。可以用函数取得当前的值。同时你还可以将函数的指针复位。用这些函数的组合来遍历数组,也不失为一种不错的解决办法。这里先介绍几个函数:
each() 函数将返回一个四个元素的数组,其中0和’key’对应的值是该数组元素的键,1和’value’对应的是当前数组元素所对应的值。并且将数组的指针向后移动一个元素。
current()返回当前数组指针中指向的数组元素。另外这个函数还有一个别名函数,pos()。
reset()将数组的指针移动到开始位置。
end()函数将指针移动到结束位置。
next()和prev()这两个函数正好相反,前者表示向前移动指针后者表示向后移动指针。这两个函数结合使用可以正向或者反向遍历数组。
用以上介绍的这几个函数结合上循环和判断,就可以写出自己的顺序遍历的方式,比如说,正向,反向。或者先遍历奇数项,再遍历偶数项等。
接下来,我们来讨论下数组的排序功能。我们经常对数组进行排序,用冒泡法,插入法等。其实PHP给我们做好了一系列的和数组相关的排序函数。
有三种排序方式只排序值的函数,基于值的方式,基于键的排序方式。对应的函数为sort,asort,ksort。
这些排序函数都是正向排序的,即由小到大的顺序进行排列。sort适合于数字索引的数组。比如说下边的代码:
$a = array (1,2,5,3,4,8,4);
sort($a); //将会按照数字的顺序从小到大排列,同时也适用于字符的排序,字符的大小,是按照字符的ASCII码的大小来确定的。
asort是按照键来排序的,比较键的大小来重修修改数组的顺序。ksort也是有一样的标准,只是比较的数据变成了数组的值。
这些函数都是正向排列的,同时为了满足反向排列的需求,PHP定义了一些reverse函数。在原来基础上附加上r即可。比如说:arsot, rsort, krost。
1维数组用以上的这些东西排序已经足够了,但是多维数组的排序就是一个难题了。莫急,我们可以用用户定义的方法类排序。我们只要提供一个函数,来返回0表示两个函数相当,返回1表示前边的数据大于后边的数据,返回-1表示后边的数据大于前边的数据,然后PHP就会按照我们的大小依据来排列数组了。
比如说下边代码的例子:
$data = array( 'abc' => array('value'=>15),'bcd'=>array('value'=>20),'cde'=>array('value'=>17));
usort($data,'compare'); //调用用户排序标准
//定义大小函数
function compare($a, $b) {
if($a['value'] == $b['value']) {
return 0; // this means the two values are equal.
} elseif ($a['value'] > $b['value']) {
return 1; //that means the a is bigger.
}else{
return -1; // this means b is bigger.
}
}
和一维数组一样,同样也有几个对应的函数:uasort,uksort。
你又要猜了吧,是不是还有附加r的函数啊!答案是没有。不好意思,不过很明显吗!我们将原来的compare函数返回相反的值不就实现反向了。
数组的排序功能还是很不错的,值得大家一用。 |