文章目录
第四章 数组
1 数组创建
1.1 使用array()函数创建数组
PHP中的数组可以是一维数组,也可以是多维数组。创建数组可以使用array()函数,语法格式如下:
array($keys=>$values,…)
<?php
// 1. array()函数创建一维数组
$array1=array(1,2,3,4); // 定义不带键名的数组
$array2=array("color1"=>"blue","color2"=>"red"); // 定义带键名的数组
$array3=array(1=>2,2=>4,5=>6,8,10); // 定义省略某些键名的数组
echo $array1[0]; // 输出数组元素
echo $array1["color2"];
echo $array1[5];
print_r($array1); // 打印数组
print_r($array2);
print_r($array3);
/*
自定义键名可以是字符串或数字。如果省略了键名,则会自动产生从0开始的整数作为键名。如果只对某个给出的值没有指定键名,则取该值前面最大的整数键名加1后的值。
注意:
如果定义了两个完全一样的键名,则后面一个会覆盖前面一个。
*/
// 2. array()函数创建多维数组
$array4=array(
"color"=>array("红色","蓝色","白色"),
"number"=>array(1,2,3,4,5,6)
);
echo $array["color"][2]; // 输出数组元素,输出结果为"白色"
print_r($array); // 打印二维数组
?>
1.2 使用变量创建数组
通过使用compact()函数,可以把一个或多个变量甚至数组,建立成数组元素,这些数组元素的键名就是变量的变量名,值是变量的值。语法格式如下:
array compact(mixed $varname [, mixed ...])
对每个参数,compact()函数在当前的符号表中查找该变量名并将它添加到输出的数组中,变量名成为键名,而变量的内容成为该键的值。
<?php
$num=10;
$str="string";
$array=array(1,2,3);
$newarray=compact("num","str","array"); // 使用变量名创建数组
print_r($newarray); // 打印数组
?>
与compact()函数相对应的是extract()函数,其作用是将数组中的单元转化为变量,例如:
<?php
// (要带自定义键名的数组,默认下标的数组不能转化为变量)
$array=array("key1"=>1, "key2"=>2, "key3"=>3);
extract($array);
echo $key1."<br>"; // 1
echo $key2."<br>"; // 2
echo $key3."<br>"; // 3
?>
1.3 使用两个数组创建一个数组
使用array_combine()函数可以使用两个数组创建另外一个数组,语法格式如下:
array array_combine(array $keys, array $values)
array_combine()函数用来自 k e y s 数 组 的 值 作 为 键 名 , 用 来 自 keys数组的值作为键名,用来自 keys数组的值作为键名,用来自values数组的值作为相应的值,最后返回一个新的数组。
<?php
$array1=array('color1', 'color2', 'color3');
$array2=array('yellow', 'blue', 'red');
$array3=array_combine($array1, $array2);
print_r($c); //输出:Array ( [color1] => yellow [color2] => blue [color3] => red )
?>
1.4 建立指定范围的数组
使用range()函数可以自动建立一个值在指定范围的数组,语法格式如下:
array range(mixed $low, mixed $high [, number $step ])
l o w 为 数 组 开 始 元 素 的 值 , low为数组开始元素的值, low为数组开始元素的值,high为数组结束元素的值。如果 l o w > low> low>high,则序列将从 h i g h 到 high到 high到low。 s t e p 是 单 元 之 间 的 步 进 值 , step是单元之间的步进值, step是单元之间的步进值,step应该为正值,如果未指定则默认为1。range()函数将返回一个数组,数组元素的值就是从 l o w 到 low到 low到high之间的值。
<?php
$array1=range(1,5);
$array2=range(2,10,2);
$array3=range("a","e");
print_r($array1); //输出:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
print_r($array2); //输出:Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 )
print_r($array3); //输出:Array ( [0] => a [1] => b [2] => c [3] => d [4] => e )
?>
1.5 自动建立数组
数组还可以不用预先初始化或创建,在第一次使用它的时候,数组就已经创建,例如:
<?php
$arr[0]="a";
$arr[1]="b";
$arr[2]="c";
print_r($arr); //输出:Array ( [0] => a [1] => b [2] => c )
?>
2 键名和值的操作
2.1 存在性检查
2.1.1 array_key_exists()函数和in_array()函数
检查数组中是否存在某个键名和值,可以使用array_key_exists()函数和in_array()函数,array_key_ exists()和in_array()函数都为布尔型,若存在则返回TRUE,若不存在则返回FASLE。
<?php
$array=array(1,2,3,8=>4,5);
if(in_array(5, $array))
echo "数组中存在值:5";
if(!array_key_exists(3, $array))
echo "数组中不存在键名:3";
?>
2.1.2 array_search()函数
array_search()函数也可以用于检查数组中的值是否存在,与in_array()函数不同的是**:**in_array()函数返回的是TRUE或FALSE,而array_search()函数当值存在时返回这个值的键名,若值不存在则返回NULL。
<?php
$array=array(1, 2, 3, 5, "b");
$key=array_search("b", $array); // 查找"b"是否在数组$array中
if($key){ // 存在则输出对应的键名
echo $key;
}
else{
echo "数组中不存在这个值";
}
?>
2.2 获取和输出
2.2.1 array_keys()函数和array_values()函数
使用array_keys()函数和array_values()函数函数可以取得数组中所有的键名和值,并保存到一个新的数组中。
<?php
$arr=array("red"=>"红色","blue"=>"蓝色","white"=>"白色");
$keys=array_keys($arr); // 取得数组中的所有键名
$values=array_values($arr); // 取得数组中的所有值
print_r($key); // 输出结果:Array ( [0] => red [1] => blue [2] => white )
print_r($values); // 输出结果:Array ( [0] => 红色 [1] => 蓝色 [2] => 白色 )
?>
2.2.2 key()函数
使用key()函数可以取得数组当前单元的键名
<?php
$array=array("a"=>1, "b"=>2, "c"=>3, "d"=>4);
echo key($array); // 输出"a"
next($array); // 将数组中的内部指针向后移动一位
echo key($array); // 输出"b"
?>
“next($array)”:表示将数组中的内部指针指向下一个单元
“end($array)”:表示将数组中的内部指针指向最后一个单元;
“reset($array)”:表示将数组中的内部指针指向第一个单元,即重置数组的指针;
“each($array)”:表示返回当前的键名和值,并将数组指针向下移动一位,这个函数非常适合在数组遍历时使用。
2.2.3 list()函数
list()函数:可以将数组中的值赋给指定的变量。这样就可以将数组中的值输出显示出来了,这个函数在数组遍历的时候将非常有用。
<?php
$arr=array("a","b","c");
list(1, 2, 3)=$arr; // 将数组$arr中的值赋给3个变量
echo $1; // 输出a
echo $2; // 输出b
echo $3; // 输出c
?>
2.3 填充数组
2.3.1 array_fill()函数和array_fill_keys()函数
使用array_fill()函数和array_fill_keys()函数可以用给定的值填充数组的值和键名。
array_fill()函数的语法格式如下:
array array_fill(int $start_index, int $num, mixed $value)
**说明:**array_fill()函数用参数 v a l u e 的 值 将 一 个 数 组 从 第 value的值将一个数组从第 value的值将一个数组从第start_index个单元开始,填充 n u m 个 单 元 。 num个单元。 num个单元。num必须是一个大于零的数值,否则PHP会发出一条警告信息。
array_fill_keys()函数的语法格式如下:
array array_fill_keys(array $keys, mixed $value)
**说明:**array_fill_keys函数用给定的数组 k e y s 中 的 值 作 为 键 名 , keys中的值作为键名, keys中的值作为键名,value作为值,并返回新数组。
<?php
$array1=array_fill(2, 3, "red");// 从下标为2的数组单元开始,填充3个值"red"
print_r($array1); // 输出结果:Array ( [2] => red [3] => red [4] => red )
$keys=array("a", 3, "b");
$array2=array_fill_keys($keys, "数组值");// 使用$keys数组中的值作为键名
print_r($array2); // 输出结果:Array ( [a] =>数组值 [3] =>数组值 [b]=>数组值)
?>
2.4 键值交换
2.4.1 array_flip()函数
array_flip()函数:可以交换数组中的键名和值
<?php
$array=array("a"=>1, "b"=>2, "c"=>3);
$array=array_flip($array); //交换键名和值
print_r($array); //输出结果:Array ( [1] => a [2] => b [3] => c )
?>
2.5 删除替换
2.5.1 array_splice()函数
array_splice()函数可以将数组中的一个或多个单元删除并用其他值代替。语法格式如下:
array array_splice(array &$input, int $offset [, int $length [, array $replacement ]])
o f f s e t 是 指 定 的 偏 移 量 , 如 果 offset是指定的偏移量,如果 offset是指定的偏移量,如果offset为正,则从 i n p u t 数 组 中 该 值 指 定 的 偏 移 量 开 始 移 除 。 如 果 input数组中该值指定的偏移量开始移除。如果 input数组中该值指定的偏移量开始移除。如果offset为负,则从$input末尾倒数该值指定的偏移量开始移除。
l e n g t h 是 指 定 删 除 的 单 元 数 , 如 果 省 略 length是指定删除的单元数,如果省略 length是指定删除的单元数,如果省略length,则移除数组中从$offset到结尾的所有部分。
如果指定了 l e n g t h 并 且 为 正 值 , 则 移 除 length并且为正值,则移除 length并且为正值,则移除offset后的$length个单元。
如果指定了 l e n g t h 并 且 为 负 值 , 则 移 除 从 length并且为负值,则移除从 length并且为负值,则移除从offset到数组末尾倒数$length个为止的所有的单元。
当给出了 r e p l a c e m e n t 后 要 移 除 从 replacement后要移除从 replacement后要移除从offset到数组末尾所有单元时,可以用count( i n p u t ) 作 为 input)作为 input)作为length。
如果给出了 r e p l a c e m e n t 数 组 , 则 被 移 除 的 单 元 被 此 数 组 中 的 单 元 替 代 。 如 果 指 定 的 replacement数组,则被移除的单元被此数组中的单元替代。如果指定的 replacement数组,则被移除的单元被此数组中的单元替代。如果指定的offset和 l e n g t h 的 组 合 结 果 不 会 移 除 任 何 值 , 则 length的组合结果不会移除任何值,则 length的组合结果不会移除任何值,则replacement数组中的单元将被插入到$offset指定的位置。如果用来替换的值只是一个单元,那么不需要给它加上“array”,除非该单元本身就是一个数组。
<?php
$input1=array(1,2,3,4,5,6);
$input2=array(1,2,3,4,5,6);
$input3=array(1,2,3,4,5,6);
$output1=array_splice($input1, 3, 2);// 删除$input1数组第三个单元后面的两个单元
print_r($input1); // 输出结果:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 6 )
print_r($output1); // 输出结果:Array ( [0] => 4 [1] => 5 )
$output2=array_splice($input2, 4, 0, 7);//在$input2数组中第四个单元添加值7
print_r($input2); //输出结果:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 7 [5] => 5 [6] => 6 )
$output3=array_splice($input3, 3, 2, array(7,8));//删除数组$input3第三个单元后面的两个单元并用值7和8代替
print_r($input3);//输出结果:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 7 [4] => 8 [5] => 6 )
?>
2.5.2 array_unique()函数
array_unique()函数可以移除数组中重复的值,返回一个新数组,并不会破坏原来的数组。
<?php
$array=array(1,1,1,2,3,4,4);
$output=array_unique($array);// 移除$array数组中重复的值
print_r($array) // 原数组
print_r($output); // 输出结果:Array ( [0] => 1 [3] => 2 [4] => 3 [5] => 4 )
?>
2.5.3 array_replace()函数
array_replace()函数可以以传递的数组替换第一个数组的元素。
array_replace ()函数的语法格式如下:
array array_replace ( array $array , array $array1 [, array $... ] )
**说明:**array_replace()函数使用后面数组 a r r a y 1 元 素 的 值 替 换 第 一 个 array1元素的值替换第一个 array1元素的值替换第一个array数组的值。
如果一个键同时存在于第一个数组和第二个数组,则它的值将被第二个数组中的值替换。
如果一个键存在于第二个数组,但是不存在于第一个数组,则会在第一个数组中创建这个元素。
如果一个键仅存在于第一个数组,则它保持不变。如果传递了多个替换数组,它们则被按顺序依次处理,后面的数组将覆盖之前的值。
<?php
$base=array("orange", "banana", "apple", "raspberry");
$replacements1=array(0=>"pineapple", 4=>"cherry");
$replacements2=array(0=>"grape", 9=>"lenmon");
$basket=array_replace($base, $replacements1, $replacements2);
print_r($basket);
//输出结果:Array ( [0] => grape [1] => banana [2] => apple [3] => raspberry [4] => cherry [9] => lenmon)
?>
3 数组的遍历和输出
3.1 使用while循环访问数组
3.2 使用for循环访问数组
<?php
$arr=[1,2,3,4,5,'x'=>6,7,8,9,10];
for ($i=0; $i<count($arr); $i++) {
echo $arr[$i]."<br>";
}
?>
3.3 使用foreach循环访问数组
<?php
$arr=[1,2,3,4,5,'x'=>6,7,8,9,10];
foreach ($arr as $key => $value) {
echo $key."------".$value."<br>";
}
?>
4 数组的排序
4.1 升序排序
使用sort()函数可以对已经定义的数组进行排序,使得数组单元按照数组值从低到高重新索引。语法格式如下:
bool sort(array &$array [, int $sort_flags ])
**说明:**sort()函数如果排序成功则返回TRUE,失败则返回FALSE。两个参数中, a r r a y 是 需 要 排 序 的 数 组 ; array是需要排序的数组; array是需要排序的数组;sort_flags的值可以影响排序的行为,$sort_flags可以取以下6个值。
- SORT_REGULAR:正常比较单元(不改变类型),这是默认值。
- SORT_NUMERIC:单元被作为数字来比较。
- SORT_STRING:单元被作为字符串来比较。
- SORT_LOCALE_STRING:根据当前的区域设置把单元作为字符串来比较。
- SORT_NATURAL:对每个单元以“自然的顺序”对字符串进行排序。
- SORT_FLAG_CASE:能够与SORT_STRING或SORT_NATURAL合并(OR位运算),不区分大小写排序字符串。
sort()函数不仅对数组进行排序,而且还删除了原来的键名,并重新分配自动索引的键名,例如:
<?php
$array1=array("a"=>5, "x"=>3, 5=>7, "c"=>1);
if(sort($array1))
print_r($array1); // 输出:Array ([0] => 1 [1] => 3 [2] => 5 [3] => 7 )
else
echo "排序\$array1失败"; // 不输出
?>
asort()函数也可以对数组的值进行升序排序,语法格式和sort()类似,但使用asort()函数排序后的数组还保持键名和值之间的关联,例如:
<?php
$fruits=array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
asort($fruits);
print_r($fruits); //输出:Array ( [c] => apple [b] => banana [d] => lemon [a] => orange )
?>
ksort()函数用于对数组的键名进行排序,排序后键名和值之间的关联不改变,例如:
<?php
$fruits=array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);
print_r($fruits); //输出:Array ( [a] => orange [b] => banana [c] => apple [d] => lemon )
?>
4.2 降序排序
rsort()函数不仅对数组进行排序,而且还删除了原来的键名,并重新分配自动索引的键名,例如:
<?php
$array1=array("a"=>5, "x"=>3, 5=>7, "c"=>1);
if(sort($array1))
print_r($array1); // 输出:Array ([0] => 7 [1] => 5 [2] => 3 [3] => 1 )
else
echo "排序\$array1失败"; // 不输出
?>
arsort()函数也可以对数组的值进行降序排序,语法格式和rsort()类似,但使用arsort()函数排序后的数组还保持键名和值之间的关联,例如:
<?php
$fruits=array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
asort($fruits);
print_r($fruits); //输出:Array ( [a] => orange [d] => lemon [b] => banana [c] => apple )
?>
krsort()函数用于对数组的键名进行排序,排序后键名和值之间的关联不改变,例如:
<?php
$fruits=array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);
print_r($fruits); //输出:Array ( [d] => lemon [c] => apple [b] => banana [a] => "orange )
?>
4.3 对数组随机排序
shuffle()函数:将数组元素按随机的顺序排列,并删除原有的键名,建立自动索引。例如:
<?php
$arr=range(1,10); // 产生有序数组
foreach($arr as $value)
echo $value. " "; // 输出有序数组,结果为1 2 3 4 5 6 7 8 9 10
echo "<br/>";
shuffle($arr); // 打乱数组顺序
foreach($arr as $value)
echo $value. "<br/>"; // 输出新的数组顺序,每次运行,结果都不一样
?>
4.4 反向排序
array_reverse()函数:将一个数组单元的元素按相反顺序排序,语法格式如下:
array array_reverse(array $array [ , bool $preserve_keys ])
如果$preserve_keys值为TRUE则保留原来的键名,为FALSE则为数组重新建立索引,默认为FALSE。例如:
<?php
$array=array("a"=>1,3,2,4);
$ar1=array_reverse($array);
$ar2=array_reverse($array,TRUE);
print_r($ar1); // 输出:Array ( [0] => 4 [1] => 2 [2] => 3 [a] => 1 )
print_r($ar2); // 输出:Array ( [2] => 4 [1] => 2 [0] => 3 [a] => 1 )
?>
4.5 自然排序
natsort()函数实现了一个和人们通常对字母、数字、字符串进行排序的方法一样的排序算法,并保持原有键/值的关联,这被称为“自然排序”。natsort()函数对大小写敏感,它与sort()函数的排序方法不同。例如:
<?php
$array1=$array2=array("img12", "img10", "img2", "img1");
sort($array1); //使用sort函数排序
print_r($array1); //输出:Array ( [0] => img1 [1] => img10 [2] => img12 [3] => img2 )
natsort($array2); //自然排序
print_r($array2); //输出:Array ( [3] => img1 [2] => img2 [1] => img10 [0] => img12 )
?>
5 数组的集合操作
5.1 数组的差集
所谓“差集”是指在一个数组(集合)中而不在另一个数组(集合)中值的集合,该集合本身也成为一个新数组。
使用array_diff()函数计算数组的差集,语法格式如下:
array array_diff ( array $array1, array $array2 [, array $... ] )
**说明:**对比返回在 a r r a y 1 中 但 是 不 在 array1中但是不在 array1中但是不在array2及任何其他参数数组中的值。注意键名保持不变。例如:
<?php
$array1=array("a"=>"green", "red", "blue", "red");
$array2=array("b"=>"green", "yellow", "red");
$result=array_diff($array1, $array2);
print_r($result); //输出:Array ( [1] => blue )
?>
此外,还可以使用键名比较计算数组的差集,使用array_diff_key()函数,例如:
<?php
$array1=array('blue'=>1, 'red'=>2, 'green'=>3, 'purple'=>4);
$array2=array('green'=>5, 'blue'=>6, 'yellow'=>7, 'cyan'=>8);
var_dump(array_diff_key($array1, $array2));
/*
打印结果如下:
array (size=2)
'red' => int 2
'purple' => int 4
*/
?>
5.2 数组的交集
所谓“交集”是指同时出现在两个数组(集合)中的值的集合,该集合本身也成为一个新数组。
使用array_intersect ()函数计算数组的交集,语法格式如下:
array array_intersect ( array $array1, array $array2 [, array $ ... ] )
说明:返回一个数组,该数组包含了所有同时出现在 a r r a y 1 、 array1、 array1、array2及任何其他参数数组中的值。注意键名保持不变。例如:
<?php
$array1=array("a"=>"green", "red", "blue");
$array2=array("b"=>"green", "yellow", "red");
$result=array_intersect($array1, $array2);
print_r($result); //输出:Array ( [a] => green [0] => red )
?>
此外,还可以使用键名比较计算数组的交集,用array_intersect_key 函数,例如:
<?php
$array1=array('blue'=>1, 'red'=>2, 'green'=>3, 'purple'=>4);
$array2=array('green'=>5, 'blue'=>6, 'yellow'=>7, 'cyan'=>8);
var_dump(array_intersect_key($array1, $array2));
/*
打印结果如下:
array (size=2)
'blue' => int 1
'green' => int 3
*/
?>
5.3 数组的并集
array_merge()函数可以将一个或多个数组合并,一个数组中的值附加在前一个数组的后面,返回作为结果的数组。语法格式如下:
array array_merge(array $array1 [, array $array2 [, array $... ]])
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前面的一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。如果只给了一个数组且该数组是数字索引的,则键名会以连续方式重新索引。例如:
<?php
$array1=array("color"=>"red",2,4);
$array2=array("a","color" => "green",4);
$result=array_merge($array1, $array2); //合并两个数组
print_r($result);
//输出:Array ( [color] => green [0] => 2 [1] => 4 [2] => a [3] => 4 )
?>
6 其它方法
6.1 数组的栈操作
根据“后进先出”的特点,出栈操作实际上删除了数组最后一个单元,使用array_pop()函数实现,例如:
<?php
$arr=array(1,2,3,4,5);
$result=array_pop($arr); //删除数组$arr的最后一个单元
print_r($arr); //输出:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
?>
数组的入栈操作是将新单元添加到数组尾部,使用array_push()函数实现,语法格式如下:
int array_push(array &$array, mixed $var [, mixed $... ])
array_push()函数将数组 a r r a y 当 成 一 个 栈 , 并 将 传 入 的 变 量 array当成一个栈,并将传入的变量 array当成一个栈,并将传入的变量var加到 a r r a y 的 末 尾 。 array的末尾。 array的末尾。array的长度将根据入栈变量的数目而增加。例如:
<?php
$arr=range(1,5);
array_push($arr,6,7); //将6和7加入数组尾部
$arr[]=8; //将8加入数组尾部,和array_push()函数实现的功能一样
print_r($arr);
//输出:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 )
?>
6.2 取得数组当前单元
和each()函数不同,current()函数能够获取数组内部指针指向的单元的值,但不移动数组的内部指针。例如:
<?php
$arr=array("a","b","c","d");
$a=current($arr); // 取得当前单元
echo $a; // 输出'a'
next($arr); // 将指针移到下一个单元
$b=current($arr);
echo $b; // 输出'b'
end($arr); // 将指针移到尾部
$d=current($arr);
echo $d; // 输出'd'
?>
6.3 数组计算
使用count()、sizeof()函数可以计算数组中的元素个数,而使用array_count_values()函数可以计算数组中一个值出现的次数。语法格式如下:
count(array $input)
sizeof(array $input)
array array_count_values(array $input)
array_count_values()函数返回一个数组,该数组用 i n p u t 数 组 中 的 值 作 为 键 名 , 以 该 值 在 input数组中的值作为键名,以该值在 input数组中的值作为键名,以该值在input数组中出现的次数作为值。例如:
<?php
$arr=array(1,2,3,1,3,1,4,1,1,4,2);
$result=array_count_values($arr);
print_r($result); //输出:Array ( [1] => 5 [2] => 2 [3] => 2 [4] => 2 )
?>
array_product()函数以整数或浮点数返回一个数组中所有值的乘积,语法格式如下:
number array_product ( array $array )
<?php
$a=array(2, 4, 6, 8);
echo "product(a) = " . array_product($a) . "\n";
echo "product(array()) = " . array_product(array()) . "\n";
//输出:product(a) = 384 product(array()) = 1
?>