PHP 数组的函数

本文最后更新于:2024年3月18日 凌晨

PHP 数组的函数

  • PHP有一些有用的函数来修改或将一个操作应用到数组的所有元素,可以合并数组,寻找数组间差别,计算总数等等,这些都可以由内置函数来完成。

指定值的范围

  • range()函数创建一个连续整数或字符的数组,整数或字符的值在传递给函数的两个参数之间,例如:
1
2
3
$numbers = range(2,5);	//$numbers = array(2,3,4,5);
$letters = range('a','z'); // 保存字母表到数组中。
$reversed_numbers = range(5,2);//$reversed_numbers = array(5,4,3,2);
  • 字符串参数中只有第一个字母被用于限定范围:
1
range('aaa','zzz')// 和range('a','z')相同。

获得数组大小

  • count()sizeof()函数在用法和效果上是完全一样的,你想使用哪个函数都可以,它们返回数组中元素的个数,下面是一个例子:
1
2
$family = array('Fred','Wilma','Pebbles');
$size = count($family); //$size为3
  • 这些函数并不根据任何可能出现的数字索引来计算元素个数:
1
2
$confusion = array(19 => 'ten',11 => 'eleven',12 => 'twelve');
$size = count($confusion); //$size为3

填充数组

  • 要用重复的内容来创建一个数组,可以使用array_pad()函数,array_pad()函数额第一个参数是数组,第二个参数是你想要数组拥有的最少元素个数,第三个参数是要给每个元素的初始值,array_pad()函数返回一个填充得到的新数组,而丢弃它的参数(源)数组,下面是array_pad()函数返回一个填充得到的新数组,而丢弃它的参数(源)数组,下面是array_pad()的实例:
1
2
$scores = array(5,10);
$padded = array_pad($scores,5,0);//$padded现在为array(5,10,0,0,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);
//$total = 310

合并两个数组

  • array_merge()函数智能地合并两个或多个数组:
1
$merged = array_merge(array1,array2[,array...]);
  • 如果和前一个数组的一个数字索引重复,那么后一个数组的值被分配给一个新的数字索引:
1
2
3
4
$first = array('hello','world');//0 => 'hello',1 => 'world'
$second = array('exit','here');//0 => 'exit',1 => 'here'
$merged = array_merge($first,$second);
//$merged = array('hello','world','exit','here')
  • 如果和前一个数组的一个字符串键重复,那么之前的值被后面的值代替:
1
2
3
4
$first = array('bill' => 'clinton','tony' => 'danza');
$second = array('bill' => 'gates','adam' => 'west');
$merged = array_merge($first,$second);
//$merged = array('bill' => 'gates','tony' => 'danza','adam' => 'west')

比较两个数组的不同

  • 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');
// 查找在$a1中但不在$a2或$a3中的值。
$diff = array_diff($a1,$a2,$a3);
//$diff为array('bill','judy');
  • 本函数使用===来比较值,所以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');
//$odds为array(0 => 9,1 => 23,3 => 27)
  • 正如你所看到的,原来的键在新数组中被保留,这个函数对于关联数组最有用。

数组与变量转换

  • PHP提供了两个函数extract()compact(),用于在数组和变量间转换,变量的名字对应数组中的键名,而变量的名字对应数组中的键名,而变量的值则成为数组中的键值,例如下面这个数组:
1
$person = array('name' => 'Fred','age' => 35,'wife' => 'Betty');
  • 可以被转换成下面的变量,或有下面的这些变量创建:
1
2
3
$name = 'Fred';
$age = 35;
$wife = 'Betty';

从数组创建变量

extract()

  • extract()函数自动从一个数组创建局部变量,数组元素的键名就是变量名:
1
extract($person);// 变量$name,$age和$wife现在被设置。
  • 如果一个从数组提取生成的变量和一个已存在的变量由相同的名字,提取生成的变量将覆盖已存在的变量。
  • 可以通过传递第二个参数来修改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;//$name为'Fred',$age为35,$wife为'Betty'
  • 如果数组中的元素个数比list()中的变量个数多,则多余的值就被忽略:
1
2
$person = array('Fred',35,'Betty');
list($name,$age) = $person;//$name为'Fred',$age为35
  • 如果list()中的值比数组中的多,则多余的值就被设为NULL:
1
2
$values = array('hello','world');
list($a,$b,$c) = $values;//$a为'hello',$b为'world',$c为NULL
  • list()中用两个或多个连续的逗号来跳过数组中的值:
1
2
$values = range('a','e');	// 使用range填充数组。
list($m,,$n,,$o) = $values; //$m为'a',$n为'c',$o为'e'

从变量中创建数组

  • 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);//$middle为array('Harriet','Brenda')
  • 一般你来说只有在索引数组(即那些有从0开始的连续整数索引的数组)上使用array_slice()才有意义:
1
2
3
// 这里使用array_slice()没有任何意义。
$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);
//$second为'Dick',$third为'Harriet'

数组分块

  • 要把数组跨分为小数组或固定大小的数组,可以使用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);
//$removed为array('math','bio','cs')
//$subjects为array('physics','chem','deama','classics')
  • 如果省略length参数,array_splice()将删除到数组末尾:
1
2
3
$removed = array_splice($subjects,2);
//$removed为array('math','bio','cs','deama','classics')
//$subjects为array('physics','chem')
  • 如果只是想简单地删除元素而不关心它们的值,则不需要将array_splice()的结果赋值给变量:
1
2
array_splice($subjects,2);
//$subjects为array('physics','chem');
  • 要在元素被删除的位置插入元素,应使用第四个参数:
1
2
3
$new = array('law','business','IS');
array_splice($subjects,4,3,$new);
//$subjects为array('physics','chem','math','bio','law','business','IS')
  • 替换数组的元素个数不需要和被删除元素的数目相同,数组可以按需要增长或收缩:
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);
//$subjects为array('physics,'chem','law','business','math')
  • 虽然到目前为止的例子使用的都是索引数组,但是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);// 删除New Zealand和Australia
$france = array('France' => 'Paris');
array_splice($capitals,1,0,$france);// 插入France

提取数组的键

  • array_keys()函数根据内部顺序返回一个仅由数组中的键组成的数组:
1
$array_of_keys = array_keys(array);
  • 下面是一个例子:
1
2
$person = array('name' => 'Fred','age' => 35,'wife' => 'Wilma');
$keys = array_keys($person);//$keys为array('name','age','wife')
  • PHP还提供了一个函数(较少使用)来得到数组中值的数组,即array_values():
1
$array_of_values = array_values(array);
  • array_keys()一样,按照数组的内部顺序返回值:
1
$values = array_values($person);//$values为array('Fred',35,'Wilma');

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!