PHP 数组的函数
本文最后更新于:2024年3月18日 凌晨
PHP 数组的函数
- PHP有一些有用的函数来修改或将一个操作应用到数组的所有元素,可以合并数组,寻找数组间差别,计算总数等等,这些都可以由内置函数来完成。
指定值的范围
range()
函数创建一个连续整数或字符的数组,整数或字符的值在传递给函数的两个参数之间,例如:
1 2 3
| $numbers = range(2,5); $letters = range('a','z'); $reversed_numbers = range(5,2);
|
获得数组大小
count()
和sizeof()
函数在用法和效果上是完全一样的,你想使用哪个函数都可以,它们返回数组中元素的个数,下面是一个例子:
1 2
| $family = array('Fred','Wilma','Pebbles'); $size = count($family);
|
- 这些函数并不根据任何可能出现的数字索引来计算元素个数:
1 2
| $confusion = array(19 => 'ten',11 => 'eleven',12 => 'twelve'); $size = count($confusion);
|
填充数组
- 要用重复的内容来创建一个数组,可以使用
array_pad()
函数,array_pad()
函数额第一个参数是数组,第二个参数是你想要数组拥有的最少元素个数,第三个参数是要给每个元素的初始值,array_pad()
函数返回一个填充得到的新数组,而丢弃它的参数(源)数组,下面是array_pad()
函数返回一个填充得到的新数组,而丢弃它的参数(源)数组,下面是array_pad()
的实例:
1 2
| $scores = array(5,10); $padded = array_pad($scores,5,0);
|
- 注意新值是如何添加到该数组末尾的,如果想让新值增加到数组的开头,可以把第二个参数设为负值:
1
| $padded = array_pad($scores,-5,0);
|
- 将
array_pad()
函数的处理结果赋值给原来的数组,可以达到在原位置改变的结果:
1
| $scores = array_pad($scores,5,0);
|
- 如果你填充元素到一个关联数组,已经存在的键将被保留,新的元素将使用从0开始的数字键。
计算数组和
array_sum()
函数合计一个索引数组或关联数组中的值:
1
| $sum = array_sum(array);
|
1 2 3
| $scores = array(98,76,56,80); $total = array_sum($scores);
|
合并两个数组
array_merge()
函数智能地合并两个或多个数组:
1
| $merged = array_merge(array1,array2[,array...]);
|
- 如果和前一个数组的一个数字索引重复,那么后一个数组的值被分配给一个新的数字索引:
1 2 3 4
| $first = array('hello','world'); $second = array('exit','here'); $merged = array_merge($first,$second);
|
- 如果和前一个数组的一个字符串键重复,那么之前的值被后面的值代替:
1 2 3 4
| $first = array('bill' => 'clinton','tony' => 'danza'); $second = array('bill' => 'gates','adam' => 'west'); $merged = array_merge($first,$second);
|
比较两个数组的不同
array_diff()
函数用于识别在一个数组中出现而不在其他数组中出行的值:
1
| $diff = array_diff(array1,array2[,array...]);
|
1 2 3 4 5 6
| $a1 = array('bill','claire','elle','simon','judy'); $a2 = array('jack','claire','toni'); $a3 = array('elle','simon','garfunkel');
$diff = array_diff($a1,$a2,$a3);
|
- 本函数使用
===
来比较值,所以1和"1"被认为是不同的,第一个数组的索引被保留,所以在$diff
中’bill’的键是0,'judy’的键是4
从数组中过滤元素
- 要从数组中根据元素值来确定一个子集,可使用
array_filter()
函数:
1
| $filtered = array_filter(array,callback);
|
- array的每个值被传递给命名为callback的函数,返回的数组只包含使函数返回true值的原始数组的元素,例如:
1 2 3 4 5 6
| function is_odd($element){ return $element % 2; } $numbers = array(9,23,24,27); $odds = array_filter($numbers,'is_odd');
|
- 正如你所看到的,原来的键在新数组中被保留,这个函数对于关联数组最有用。
数组与变量转换
- PHP提供了两个函数
extract()
和compact()
,用于在数组和变量间转换,变量的名字对应数组中的键名,而变量的名字对应数组中的键名,而变量的值则成为数组中的键值,例如下面这个数组:
1
| $person = array('name' => 'Fred','age' => 35,'wife' => 'Betty');
|
1 2 3
| $name = 'Fred'; $age = 35; $wife = 'Betty';
|
从数组创建变量
extract()
函数自动从一个数组创建局部变量,数组元素的键名就是变量名:
- 如果一个从数组提取生成的变量和一个已存在的变量由相同的名字,提取生成的变量将覆盖已存在的变量。
- 可以通过传递第二个参数来修改
extract()
的行为,附录A描述了第二个参数可能的值,最有用的值是EXRE_PREFIX_ALL,它指定extract()
的第三个参数为要创建变量名的前缀,这可以帮助确保使用extract()
时创建唯一的变量。
- 使用EXRE_PREFIX_ALL时很好的PHP编码风格,如下所示:
1 2 3 4 5 6
| $shape = "round"; $array = array("cover" => "brid","shape" => "rectangular"); extract($array,EXRE_PREFIX_ALL,"book"); echo "Cover: $book_cover, Book Shape: $book_shape,Shape: $shape";
Cover: bird, Book Shape: rectangular,Shape:round
|
list()
- 要把一个数组的所有值都赋值到变量中,可以使用
list()
结构:
1
| list($variable,...) = $array;
|
- 数组的值将按数组内部顺序被复制到列出的变量中,在默认情况下这个顺序就是它们被插入的顺序,但是稍后描述的排序函数可以让你改变这个顺序,下面是一个例子:
1 2
| $person = array('Fred',35,'Betty'); list($name,$age,$wife) = $person;
|
- 如果数组中的元素个数比
list()
中的变量个数多,则多余的值就被忽略:
1 2
| $person = array('Fred',35,'Betty'); list($name,$age) = $person;
|
- 如果
list()
中的值比数组中的多,则多余的值就被设为NULL:
1 2
| $values = array('hello','world'); list($a,$b,$c) = $values;
|
- 在
list()
中用两个或多个连续的逗号来跳过数组中的值:
1 2
| $values = range('a','e'); list($m,,$n,,$o) = $values;
|
从变量中创建数组
compact()
函数与extract()
函数互补,将多个变量名或单个数组作为参数传递给compact()
,可合并出一个数组,compact()
函数创建一个关联数组,它的键是变量名并且值为变量的值,在数组中任何和实际变量不符合的名字都被跳过,下面是使用compact()
的一个例子:
1 2 3 4 5 6 7
| $color = 'indigo'; $shape = 'curvy'; $floppy = 'none'; $a = compact('color','shape','floppy');
$names = array('color','shape','floppy'); $a = compact($names);
|
切割数组
- 要析取数组的一个子集,可以使用
array_slice()
函数:
1
| $subset = array_slice(array,offset,length);
|
array_slice()
函数返回一个由原始数组中的连续元素组成的新数组,offset参数指定要复制的初始元素(0说明是数组的第一个元素),length参数指定要复制的值的个数,新数组有从0开始的连续数字键,例如:
1 2
| $people = array('Tom','Dick','Harriet','Brenda','Jo'); $middle = array_slice($people,2,2);
|
- 一般你来说只有在索引数组(即那些有从0开始的连续整数索引的数组)上使用
array_slice()
才有意义:
1 2 3
| $person = array('name' => "Fred','age' => 35, 'wife' => 'Betty'); $subset = array_slice($person,1,2);//$subset为array(0 => 35,1 => 'Betty')
|
- 结合使用
list()
和array_slice()
来析取一些值到变量中:
1 2 3
| $order = array('Tom','Dick','Harriet','Brenda','Jo'); list($second,$third) = array_slice($order,1,2);
|
数组分块
- 要把数组跨分为小数组或固定大小的数组,可以使用
array_chunk()
函数:
1
| chunks = array_chunk(array,size[,preserve_key]);
|
- 本函数返回一个由小数组成的数组,第三个参数preserve_keys是一个布尔值,它指定新数组的元素是否和原数组相同的键(用于关联数组)还是从0开始的新数字键(用于索引数组),默认是分配新的键,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| $nums = range(1,7); $rows = array_chunk($nums,3); print_r($rows); Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [1] => Array ( [0] => 4 [1] => 5 [2] => 6 ) [2] => Array ( [0] => 7 ) )
|
检查元素是否存在
- 要检查数组中的一个元素是否存在,使用
array_key_exists()
函数:
1
| if(array_key_exists(key,array)){...}
|
- 本函数返回一个布尔值,如果array数组中存在名为key的有效键,则返回true,否则返回false
- 在检查数组元素是否存在时,简单地这样进行判断是不够的:
1
| if($person['name']){...}
|
- 即使数组中有一个元素使用了键name,它对应的值也可能是false(例如,0,NULL或空字符串),所以我们要使用
array_key_exists()
来替代,如下所示:
1 2 3 4 5 6 7 8 9
| $person['age'] = 0; if($person['age']){ echo "true!\n"; } if(array_key_exists('age',$person)){ echo "exists!\n"; }
exists!
|
- 许多人使用
isset()
函数来代替,如果元素存在且不为NULL,则函数返回true
1 2 3 4 5 6 7 8 9 10
| $a = array(0,NULL,' '); function tf($v){ return $v ? "T" : "F"; } for($i = 0;$i < 4;$i++){ printd("%d:%s %s\n",$i,tf(isset($a[$i])),tf(array_key_exists($i,$a))); }
0:T T 1:F T 2:T T 3:F F
|
在数组中删除和插入元素
array_splice()
函数可以在数组中删除或插入元素,并且可以用被删除的元素创建另一个数组:
1
| $removed = array_splice(array,start,[,length[,replacement]]);
|
- 我们来看一下在下面这个数组中
array_splice()
的使用:
1
| $subjects = array('physics','chem','math','bio','cs','drama','calssics');
|
- 我们可以告诉
array_splice()
从位置2开始删除3个元素,这样可以删除math,bio和cs元素:
1 2 3
| $removed = array_splice($subjects,2,3);
|
- 如果省略length参数,
array_splice()
将删除到数组末尾:
1 2 3
| $removed = array_splice($subjects,2);
|
- 如果只是想简单地删除元素而不关心它们的值,则不需要将
array_splice()
的结果赋值给变量:
1 2
| array_splice($subjects,2);
|
1 2 3
| $new = array('law','business','IS'); array_splice($subjects,4,3,$new);
|
- 替换数组的元素个数不需要和被删除元素的数目相同,数组可以按需要增长或收缩:
1 2 3
| $new = array('law'','business','IS'); array_splice($subjects,,3,4,$new); //$subjects为array('physics','chem','math','law','business','IS')
|
- 想得到把新元素插入到数组的效果,要把已存在的元素推到右边,删除0个元素:
1 2 3 4
| $subjects = array('physics','chem','math'); $new = array('law','business'); array_splice($subjects,2,0,$new);
|
- 虽然到目前为止的例子使用的都是索引数组,但是
array_splice()
也可以用于关联数组:
1 2 3 4 5 6 7 8 9
| $capitals = array('USA' => 'Washington', 'Great Britain' => 'London', 'New Zealand' => 'Wellington', 'Australia' => 'Canberra', 'Italy' => 'Rome', 'Canada' => 'Ottawa'); $down_under = array_splice($capitals,2,2); $france = array('France' => 'Paris'); array_splice($capitals,1,0,$france);
|
提取数组的键
array_keys()
函数根据内部顺序返回一个仅由数组中的键组成的数组:
1
| $array_of_keys = array_keys(array);
|
1 2
| $person = array('name' => 'Fred','age' => 35,'wife' => 'Wilma'); $keys = array_keys($person);
|
- PHP还提供了一个函数(较少使用)来得到数组中值的数组,即
array_values()
:
1
| $array_of_values = array_values(array);
|
- 和
array_keys()
一样,按照数组的内部顺序返回值:
1
| $values = array_values($person);
|