[PHP] 数组

1. 使用数组


1.1 PHP数组

PHP支持数字索引数组和关联数组,存储在数组中的值称为数组元素,每个数组元素有一个相关的索引,PHP中可以使用数字或字符串做为数组的索引。


1.2 数字索引

要创建一个数字索引数组,可以用如下代码:

$objects = array('obj1', 'obj2', 'obj3');

如果需要将按升序排序的数字保存在一个数组中,可以使用range()函数自动创建这个数组,例如:

$numbers = range(1, 10);

range()函数有一个可选参数,允许设置值之间的间幅,例如,建立一个奇数数组,可以用:

$odds = range(1, 10, 2);

range()函数也可以对字符进行操作,例如:

$letters = range('a', 'z');

访问数字索引数组,可以使用变量名称和索引的组合,索引在变量名称后面用方括号括起来。

echo $objects[0];

在默认情况下,0元素是数组的第一个元素,使用运算符"="可以改变数组的内容,例如:

$projects[0] = 'object1';


1.3 关键字索引

要创建一个关联数组,可以用如下代码:

$objects = array('a'=>'obj1', 'b'=>'obj2', 'c'=>'obj3');

访问关联数组,可以使用变量名称和关键字的组合,例如:

echo $objects['a'];


1.4 数组循环

要对数组中的每一个元素进行操作,可以使用foreach()循环或list()和each()结构。要使用foreach(),可以按如下方式:

foreach ($objects as $key=>$value) {
  echo $key."-".$value."<br/>";
}

另一种方法是使用each(),这个函数将返回数组的当前元素,并将下一个元素置为当前元素,例如:

while ($element = each($objects)) {
  echo $element[$key];
  echo "-";
  echo $element[$value];
  echo "<br/>";
}

还有一种更高级的方式可以完成同样的操作。函数list()可以用来将数组分解成一系列的值,例如:

while (list($key, $value) = each($objects)) {
  echo $key."-".$value."<br/>";
}

注意当使用each()函数时,数组将记录当前元素,如果希望再次使用该数组,必须使用reset()将当前元素重置到数组开始处。


1.5 数组操作符

数组操作符
操作符名称示例结果
+联合$a + $b$a与$b的联合,$b将被附加到$a中。
==等价$a == $b如果$a与$b包含的元素相同,则返回true。
===恒等$a === $b如果$a与$b包含相同顺序和类型元素,则返回true。
!=不等价$a != $b如果$a与$b不包含相同的元素,则返回true。
<>不等价$a <> $b与!=相同。
!==不恒等$a !== $b如果$a与$b不包含相同顺序类型元素,则返回true。


1.6 多维数组

数组不一定是关键字和值的简单列表,数组中的位置还可以保存另一个数组,使用这种方法,可以创建一个二维数组,可以把二维数组当成一个矩阵。

按照同样的思路,数组元素还可以包含新数组,这些新的数组又可以再包含新的数组,这样可以创建三维、四维或更多维的数组,PHP中没有设置数组维数的限制。


2. 数组排序


2.1 正向与反向排序

可以使用sort()函数对一个数组进行排序,按升序排列,例如:

sort(array(1, 5, 8, 2, 3));

sort()函数是区分字母大小写的,因此所有大写字母都在小写字母的前面。例如A小于Z,而Z小于a。

sort()函数有一个可选参数,这个参数可以传递SORT_REGULAR(默认),SORT_NUMERIC或SORT_STRING,用来指定排序类型。例如,当比较可能包含2和12的字符串时,从数字角度看,2要小于12,但是作为字符串,'12'却要小于'2'。

如果用关联数组存储,就需要用不同的排序函数使关键字和值在排序时仍然保持一致。函数asort()根据数组的每个元素值进行排序,如果要按关键字排序,可以使用ksort()函数,例如:

$objects = array('obj1'=>1, 'obj2'=>8, 'obj3'=>3);
asort($objects);
ksort($objects);

sort()、asort()、ksort()这3个函数都对应一个反向排序函数,可以将数组按降序排列。实现反向排序的函数是rsort()、arsort()和krsort(),反向排序函数的用法与排序函数相同。


2.2 用户定义排序

usort()函数可以使用自定义的排序规则对数组进行排序,例如:

function compare($x, $y) {
  if ($x == $y) {
    return 0;
  }
  else if ($x < $y) {
    return -1;
  }
  else {
    return 1;
  }
}
usort($projects, 'compare');

为了使usort()函数能够使用,compare()函数必须比较$x和$y。如果$x等于$y,则返回0,如果$x小于$y,则返回-1,如果$x大于$y,则返回一个正数。

类似于asort(),当对非数字索引数组的值进行排序时,使用uasort()函数和uksort()函数。usort()没有反向的变体,但可以进行反向排序,只需将$x与$y比较的返回值互换即可。


2.3 随机排序和逆向排序

shuffle()函数将数组元素进行随机排序,例如:

$objects = array('obj1', 'obj2', 'obj3');
shuffle($objects);

而array_reverse()函数将数组进行逆向排序,但是array_reverse()函数将返回一个原数组修改后的副本,例如:

$objects = array('obj1', 'obj2', 'obj3');
$newobjs = array_reverse($objects);


3. 其他数组操作


3.1 数组浏览

每个数组都有一个指针指向数组中的当前元素。当使用函数each()时,就间接使用了这个指针。

当创建一个新数组,当前指针就被初始化,指向数组的第一个元素,调用current($array_name)将返回第一个元素。

调用next()或each()将使指针前移一个元素,调用each($array_name)会在指针前移一个位置前返回当前元素,而next($array_name)是将指针前移,然后再返回新的当前元素。prev()函数与next()函数相反,它是将当前指针往回移一个位置然后再返回新的当前元素。

reset()函数将返回指向数组第一个元素的指针,而end($array_name)可以将指针移到数组末尾。


3.2 对数组元素应用函数

array_walk()函数允许以相同方式使用或修改数组中的每一个元素,原型如下:

bool array_walk(array arr, string func[, mixed userdata])

其调用方式类型于usort()函数,第一个参数是需要处理的数组,第二个参数是用户自定义并将作用于数组中每个元素的函数,第三个参数是可选的,它可以作为一个参数传递给自定义的函数,例如:

function my_print($value) {
  echo "$value<br/>";
}
array_walk($array, 'my_print');


3.3 统计数组元素个数

count()函数可以对一个数组中的元素个数进行统计,函数sizeof()具有同样的用途,如果传递给这个函数的数组是一个空数组,或者是一个没有经过设定的变量,返回的数组元素个数是0.

函数array_count_values()会统计每个特定的值在数组$array中出现过的次数(即数组基数集),它将返回一个包含频率表的关联数组,这个数组包含数组$array中的所有值,并以这些值作为关联数组的关键字,对应的数值就是关键字在$array中出现的次数,例如:

$array = array(2, 3, 6, 7, 2, 6, 1, 3, 3);
$count = array_count_values($array);


3.4 数组转换成标量变量

对于非数字索引数组,可以使用extract()函数将它们转换成一系列标量变量,函数的原型如下:

extract(array var_array[, int extract_type[, string prefix]])

例如:

$array = array('obj1'=>1, 'obj2'=>2, 'obj3'=>3);
extract($array);
echo "$obj1 $obj2 $obj3";

可选参数extract_type告诉extract()函数如何处理冲突,有时可能已经存在一个和数组关键字同名的变量,默认操作是覆盖已有的变量。

extract_type的可用值
类型
意义
EXTR_OVERWRITE发生冲突时覆盖已有变量。
EXTR_SKIP发生冲突时跳过一个元素。
EXTR_PREFIX_SAME发生冲突时创建一个$prefix_key变量。
EXTR_PREFIX_ALL在所有变量前加上$prefix。
EXTR_PREFIX_INVALID在可能无效的变量前加上$prefix。
EXTR_IF_EXISTS只提取已经存在的变量。
EXTR_PREFIX_IF_EXISTS在不带前缀的情况下,创建带前缀的变量。
EXTR_REFS以引用方式提取变量。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值