PHP程序设计读书笔记十之数组
程序员文章站
2024-01-19 09:45:10
数组:
1.索引数组和关联数组
索引数组的键名是整数并且从0开始。
关联数组的键名是字符串,看起来像有两个列的数据表:第一列是用于访问键值的键名,第二列是键值
在两种情况下...
数组:
1.索引数组和关联数组
索引数组的键名是整数并且从0开始。
关联数组的键名是字符串,看起来像有两个列的数据表:第一列是用于访问键值的键名,第二列是键值
在两种情况下,键都是唯一的,不能为同一个数组中的两个或多个元素使用相同的键。
2.数组元素的访问
我们可以使用数组变量的名字后跟括在中括号中的元素键(也称作索引)来访问数组中的特定的值。$arr[index];
键可以是一个字符串或一个整数。等价于整数(但不以0开头)的字符串值被当作整数对待。也就是说:$arr[3]等价于$arr['3'],但是都不等价于$arr['03']
使用带引号的键是很好的PHP风格,因为没有引号的键不能和常量区别开来。当你把一个常量当做无引号的索引使用时,PHP会把常量的值当作索引使用。
也就是说:
define('index',5);
echo $array[index];//将输出$array[5],而不是$array['index']
如果要在键名中使用变量替换来建立数组索引,必须使用双引号,才能进行变量解析。$age["Clone$number"]
如果要通过变量替换得到某个数组元素,则键名不要使用引号,否则会出错。
print "Hello, $person[name]";//正确
print "Hello, $person['name']";//错误
3.在数组中存储数据(初始化)
如果数组不存在,那么向数组存放值将创建该数组,但在一个未定义的数组中检索值不会创建数组。
初始化索引数组:$arr = array('a','b','c');//索引值(从0开始)是自动创建的
也可以使用:$arr = array(1 => 'Monday','Tuesday','Wednesday');后面元素的键值将会在第一个指定键值得基础上依次递增。
初始化关联数组(使用=>来分隔索引和值):$arr = array('a' => 'aaa',
'b' => 'bbb',
'c' => 'ccc');
也可以使用:$arr = array('Friday' => 'Black','Brown','Green');这条语句等价于$arr = array('Friday' => 'Black',0 => 'Brown',1 => 'Green');
初始化一个空数组:$arr = array();
4.在数组末尾添加值
语法:$arr[] = 'Pebbles';
这种方式假设该数组的索引是数字,并且把元素分配给下一个可用的数字索引,数字索引从0开始。
利用这种语法给关联数组添加值是程序员常犯的错误。
5.指定值的范围
range()函数创建一个连续整数或字符的数组,整数或字符的值在传递给函数的两个参数之间。
$num = range(2,5);//$num = array(2,3,4,5);
$letter = array('a','z');//保存字母表到数组中
字符串参数中只有第一个字母被用于限定范围:range('aaa','zzz');等价于range('a','z');
6.获得数组的大小
count()和sizeof()函数
7.填充数组
用重复的内容来创建一个数组,可以使用array_pad()函数。
$arr2 = array_pad($arr1,$num,$init);
第一个参数是要操作的数组,
第二个参数是你想要数组拥有的最少元素个数
第三个参数是要给每个元素的初始值
返回值:填充后的数组,丢弃它的源数组。(重新分配空间创建新数组,并释放源数组的空间)
$score = array(5,10);
$padded = array_pad($score,5,0);//$padded为{5,10,0,0,0}
如果想要把新值增加到数组的开头,可以把第二个参数设置为负数
如果不想在新开辟的空间创建数组,可以:$score = array_pad($score,5,0);
如果你填充元素到一个关联数组,已经存在的键将被保留。新的元素将使用从0开始的数字键。
8.多维数组
数组中的值也可以是数组,这样可以来创建多维数组:
$row1 = array(1,2,3);
$row2 = array(4,5,6);
$row3 = array(7,8,9);
$multi = array($row1,$row2,$row3);
可以通过添加更多的[]来引用多维数组中的元素:
$value = $multi[2][0]
要使用变量替换来访问多维数组中的元素,必须将整个元素用大括号括起来:
echo "The value at row 2,column 0 is {$multi[2][0]}\n";
9.析取多个值
要把一个数组的所有值都复制到变量中,可以使用list结构
list($var1,$var2,...) = $array;
数组的值将按数组的内部顺序被复制到列出的变量中。在默认情况下这个顺序就是他们被插入的顺序。
$person = array('Fred',35,'Betty');
list($name,$age,$wife) = $person;//$name为Fred,$age为35,$wife为Betty
如果数组中的元素个数比list()中的变量多,则多余的值就被忽略
如果list()中的值比数组中的多,则多余的值就被设为NULL
在list()中用两个或多个连续的逗号来跳过数组中的值:
$value = range('a','e');
list($m,,$n,,$o) = $value;//$m为'a',$n为'c',$o为'e'
10.切割数组
要析取数组的一个子集,可以使用array_slice()函数:
$subset = array_slice(array,offset,length);
返回值为由原始数组中的连续元素组成的新数组,新数组有从0开始的数字键。
第二个参数:要复制的初始元素
第三个参数:要复制的值个数。
可以使用array_slice()来进行数组切割的只有是索引数组才有意义。
11.把一个大数组划分成一个多维的小数组,可以使用array_chunk()函数:
$chunk = array_chunk(array,size[,preserve_key]);
第三个参数:是一个布尔值,它指定新数组的元素是否有和原数组相同的键(用于关联数组)还是重新分配的从0开始的数字键(用于索引数组)。默认为分配新的键
12.得到一个仅由数组中的键组成的数组:
$array_of_keys = array_keys(array);
得到一个仅由数组中的值组成的数组
$array_of_values = array_values(array);
13.检查元素是否存在
array_key_exists()函数:$array_key_exists(key,array);//返回一个布尔值,如果array数组中存在名为key的有效键,则返回true,否则返回false
if($array['name']){...}//简单的这样判断是不够的,因为当name键的值为0,NULL或空字符串时,这个条件语句也为false
14.在数组中插入和删除元素
array_splice()函数可以在数组中删除或插入元素,并且可以用被删除的元素创建另一个数组
$removed = array_splice(array,start[,length[,replacement]]);//如果省略length参数,array_splice()将删除到数组末尾
要在元素被删除的位置插入元素,应该使用第四个参数指定,而且替换数组的元素个数不需要和被删除的元素数目相同。
该函数也可用于关联数组
15.在数组和变量间转换
1.从数组创建变量:
extract()函数自动从一个数组创建局部变量,数组元素的键名就是变量名
如果一个从数组提取生成的变量和一个已存在的变量有相同的名字,提取生成的变量将覆盖已存在的变量。
可以通过第二个参数来修改extract()的行为,其中最有用的是EXTR_PREFIX_ALL,它指定extract()的第三个参数为要创建变量名的前缀,这可以帮助使用extract()函数时创建唯一的变量名
2.从变量创建数组
将多个变量名或单个数组作为参数传递给compact()可合并出一个数组。compact()函数创建一个关联数组,它的键是变量名并且值为变量的值。
在数组中任何和实际变量不符合的名字都被跳过。
16.数组的遍历
方式一:foreach结构,foreach结构并没有操作数组本身,而是操作数组的一份拷贝,在foreach循环体中插入或删除元素是安全的
方式二:迭代器:指向当前元素的指针被称为迭代器,相关函数:current();返回迭代器当前指向的元素;reset();移动迭代器到数组的第一个元素并返回该元素
next()移动迭代器到数组的下一个元素并返回该元素;prev()移动迭代器到数组的上一个元素并返回该元素;end();移动迭代器到数组的最后一个元素并返回该元素
each();以数组的形式返回当前元素的键和值,并移动迭代器到数组的下一个元素;key()返回当前元素的键
each()函数用于遍历数组元素,但是这种方法并没有像foreach()那样产生数组的一个拷贝。处理大数组时想要节约内存,可以采用这种方法
17.为数组的每个元素调用函数:array_walk(array,function_name[,param3]);自定义的函数可选的接收2个或三个参数:第一个参数是元素的值,第二个参数是元素的键,第三个是该函数被array_walk()调用时使用的值
18.查找元素值in_array(to_find,array[,strict])函数,如果第一个参数是在第二个参数指定的数组中的元素,则返回true,否则返回false
如果第三个参数是true,那么to_find的数据类型必须和数组的值相匹配。默认为false
使用in_array()函数比使用循环检查数组的每个值来寻找一个值要快得多。
in_array()函数的变种函数:array_search()函数,该函数的返回值为找到元素的键
19.排序
按值排序数组,然后从0开始重新分配索引:升序:sort(),降序:rsort(),用户自定义顺序:usort()
按值排序:升序:asort(),降序:arsort(),用户自定义顺序:uasort()
按键排序:升序:ksort(),降序:krsort(),用户自定义顺序:uksort()
按自然顺序排序(0,1,2,3,4,5,...):natsort($array);
20.翻转数组
array_reverse()函数翻转数组中的元素的内部顺序,数字索引从0开始重新编号,字符串索引则不受影响;
array_flip()函数返回数组,它翻转了每个元素的键-值对的顺序(键值互换)
21.计算数组和
array_sum()函数合计一个索引数组或关联数组中的值
22.合并两个数组
array_merge(array1,array2[,...])
如果和前一个数组的一个数字索引重复,那么后一个数组的值被分配给一个新的数字索引
如果和前一个数组的一个字符串键重复,那么之前的值被后面的值代替
23.比较两个数组的不同
array_diff()函数用于识别在一个数组中出现而不在其他数组中出现的值
$diff = array(array1,array2[,...]);
第一个数组的索引将被保留
24.从数组中筛选元素
要从数组中根据元素值来确定一个子集,可使用array_filter()函数
$filtered = array_filter(array,callback);
array的每个值被传递给命名为callback的函数。返回的数组只包含使函数返回true值的原始数组的元素
25.数组的高级用法
集合
求集合的并集:
function array_union($a,$b){
$union = array_merge($a,$b);
$union = array_unique($union);
return $union;
}
求集合的交集:
array_intersect();接收任意个数组作为参数,并且返回在每个数组中都存在的值的数组。如果有多个键有相同的值,保存值的第一个键。
求集合的差集:
array_diff()函数
堆栈
array_push()和array_pop()表示入栈和出栈
array_shift()和array_unshift()函数把数组作为队列对待
1.索引数组和关联数组
索引数组的键名是整数并且从0开始。
关联数组的键名是字符串,看起来像有两个列的数据表:第一列是用于访问键值的键名,第二列是键值
在两种情况下,键都是唯一的,不能为同一个数组中的两个或多个元素使用相同的键。
2.数组元素的访问
我们可以使用数组变量的名字后跟括在中括号中的元素键(也称作索引)来访问数组中的特定的值。$arr[index];
键可以是一个字符串或一个整数。等价于整数(但不以0开头)的字符串值被当作整数对待。也就是说:$arr[3]等价于$arr['3'],但是都不等价于$arr['03']
使用带引号的键是很好的PHP风格,因为没有引号的键不能和常量区别开来。当你把一个常量当做无引号的索引使用时,PHP会把常量的值当作索引使用。
也就是说:
define('index',5);
echo $array[index];//将输出$array[5],而不是$array['index']
如果要在键名中使用变量替换来建立数组索引,必须使用双引号,才能进行变量解析。$age["Clone$number"]
如果要通过变量替换得到某个数组元素,则键名不要使用引号,否则会出错。
print "Hello, $person[name]";//正确
print "Hello, $person['name']";//错误
3.在数组中存储数据(初始化)
如果数组不存在,那么向数组存放值将创建该数组,但在一个未定义的数组中检索值不会创建数组。
初始化索引数组:$arr = array('a','b','c');//索引值(从0开始)是自动创建的
也可以使用:$arr = array(1 => 'Monday','Tuesday','Wednesday');后面元素的键值将会在第一个指定键值得基础上依次递增。
初始化关联数组(使用=>来分隔索引和值):$arr = array('a' => 'aaa',
'b' => 'bbb',
'c' => 'ccc');
也可以使用:$arr = array('Friday' => 'Black','Brown','Green');这条语句等价于$arr = array('Friday' => 'Black',0 => 'Brown',1 => 'Green');
初始化一个空数组:$arr = array();
4.在数组末尾添加值
语法:$arr[] = 'Pebbles';
这种方式假设该数组的索引是数字,并且把元素分配给下一个可用的数字索引,数字索引从0开始。
利用这种语法给关联数组添加值是程序员常犯的错误。
5.指定值的范围
range()函数创建一个连续整数或字符的数组,整数或字符的值在传递给函数的两个参数之间。
$num = range(2,5);//$num = array(2,3,4,5);
$letter = array('a','z');//保存字母表到数组中
字符串参数中只有第一个字母被用于限定范围:range('aaa','zzz');等价于range('a','z');
6.获得数组的大小
count()和sizeof()函数
7.填充数组
用重复的内容来创建一个数组,可以使用array_pad()函数。
$arr2 = array_pad($arr1,$num,$init);
第一个参数是要操作的数组,
第二个参数是你想要数组拥有的最少元素个数
第三个参数是要给每个元素的初始值
返回值:填充后的数组,丢弃它的源数组。(重新分配空间创建新数组,并释放源数组的空间)
$score = array(5,10);
$padded = array_pad($score,5,0);//$padded为{5,10,0,0,0}
如果想要把新值增加到数组的开头,可以把第二个参数设置为负数
如果不想在新开辟的空间创建数组,可以:$score = array_pad($score,5,0);
如果你填充元素到一个关联数组,已经存在的键将被保留。新的元素将使用从0开始的数字键。
8.多维数组
数组中的值也可以是数组,这样可以来创建多维数组:
$row1 = array(1,2,3);
$row2 = array(4,5,6);
$row3 = array(7,8,9);
$multi = array($row1,$row2,$row3);
可以通过添加更多的[]来引用多维数组中的元素:
$value = $multi[2][0]
要使用变量替换来访问多维数组中的元素,必须将整个元素用大括号括起来:
echo "The value at row 2,column 0 is {$multi[2][0]}\n";
9.析取多个值
要把一个数组的所有值都复制到变量中,可以使用list结构
list($var1,$var2,...) = $array;
数组的值将按数组的内部顺序被复制到列出的变量中。在默认情况下这个顺序就是他们被插入的顺序。
$person = array('Fred',35,'Betty');
list($name,$age,$wife) = $person;//$name为Fred,$age为35,$wife为Betty
如果数组中的元素个数比list()中的变量多,则多余的值就被忽略
如果list()中的值比数组中的多,则多余的值就被设为NULL
在list()中用两个或多个连续的逗号来跳过数组中的值:
$value = range('a','e');
list($m,,$n,,$o) = $value;//$m为'a',$n为'c',$o为'e'
10.切割数组
要析取数组的一个子集,可以使用array_slice()函数:
$subset = array_slice(array,offset,length);
返回值为由原始数组中的连续元素组成的新数组,新数组有从0开始的数字键。
第二个参数:要复制的初始元素
第三个参数:要复制的值个数。
可以使用array_slice()来进行数组切割的只有是索引数组才有意义。
11.把一个大数组划分成一个多维的小数组,可以使用array_chunk()函数:
$chunk = array_chunk(array,size[,preserve_key]);
第三个参数:是一个布尔值,它指定新数组的元素是否有和原数组相同的键(用于关联数组)还是重新分配的从0开始的数字键(用于索引数组)。默认为分配新的键
12.得到一个仅由数组中的键组成的数组:
$array_of_keys = array_keys(array);
得到一个仅由数组中的值组成的数组
$array_of_values = array_values(array);
13.检查元素是否存在
array_key_exists()函数:$array_key_exists(key,array);//返回一个布尔值,如果array数组中存在名为key的有效键,则返回true,否则返回false
if($array['name']){...}//简单的这样判断是不够的,因为当name键的值为0,NULL或空字符串时,这个条件语句也为false
14.在数组中插入和删除元素
array_splice()函数可以在数组中删除或插入元素,并且可以用被删除的元素创建另一个数组
$removed = array_splice(array,start[,length[,replacement]]);//如果省略length参数,array_splice()将删除到数组末尾
要在元素被删除的位置插入元素,应该使用第四个参数指定,而且替换数组的元素个数不需要和被删除的元素数目相同。
该函数也可用于关联数组
15.在数组和变量间转换
1.从数组创建变量:
extract()函数自动从一个数组创建局部变量,数组元素的键名就是变量名
如果一个从数组提取生成的变量和一个已存在的变量有相同的名字,提取生成的变量将覆盖已存在的变量。
可以通过第二个参数来修改extract()的行为,其中最有用的是EXTR_PREFIX_ALL,它指定extract()的第三个参数为要创建变量名的前缀,这可以帮助使用extract()函数时创建唯一的变量名
2.从变量创建数组
将多个变量名或单个数组作为参数传递给compact()可合并出一个数组。compact()函数创建一个关联数组,它的键是变量名并且值为变量的值。
在数组中任何和实际变量不符合的名字都被跳过。
16.数组的遍历
方式一:foreach结构,foreach结构并没有操作数组本身,而是操作数组的一份拷贝,在foreach循环体中插入或删除元素是安全的
方式二:迭代器:指向当前元素的指针被称为迭代器,相关函数:current();返回迭代器当前指向的元素;reset();移动迭代器到数组的第一个元素并返回该元素
next()移动迭代器到数组的下一个元素并返回该元素;prev()移动迭代器到数组的上一个元素并返回该元素;end();移动迭代器到数组的最后一个元素并返回该元素
each();以数组的形式返回当前元素的键和值,并移动迭代器到数组的下一个元素;key()返回当前元素的键
each()函数用于遍历数组元素,但是这种方法并没有像foreach()那样产生数组的一个拷贝。处理大数组时想要节约内存,可以采用这种方法
17.为数组的每个元素调用函数:array_walk(array,function_name[,param3]);自定义的函数可选的接收2个或三个参数:第一个参数是元素的值,第二个参数是元素的键,第三个是该函数被array_walk()调用时使用的值
18.查找元素值in_array(to_find,array[,strict])函数,如果第一个参数是在第二个参数指定的数组中的元素,则返回true,否则返回false
如果第三个参数是true,那么to_find的数据类型必须和数组的值相匹配。默认为false
使用in_array()函数比使用循环检查数组的每个值来寻找一个值要快得多。
in_array()函数的变种函数:array_search()函数,该函数的返回值为找到元素的键
19.排序
按值排序数组,然后从0开始重新分配索引:升序:sort(),降序:rsort(),用户自定义顺序:usort()
按值排序:升序:asort(),降序:arsort(),用户自定义顺序:uasort()
按键排序:升序:ksort(),降序:krsort(),用户自定义顺序:uksort()
按自然顺序排序(0,1,2,3,4,5,...):natsort($array);
20.翻转数组
array_reverse()函数翻转数组中的元素的内部顺序,数字索引从0开始重新编号,字符串索引则不受影响;
array_flip()函数返回数组,它翻转了每个元素的键-值对的顺序(键值互换)
21.计算数组和
array_sum()函数合计一个索引数组或关联数组中的值
22.合并两个数组
array_merge(array1,array2[,...])
如果和前一个数组的一个数字索引重复,那么后一个数组的值被分配给一个新的数字索引
如果和前一个数组的一个字符串键重复,那么之前的值被后面的值代替
23.比较两个数组的不同
array_diff()函数用于识别在一个数组中出现而不在其他数组中出现的值
$diff = array(array1,array2[,...]);
第一个数组的索引将被保留
24.从数组中筛选元素
要从数组中根据元素值来确定一个子集,可使用array_filter()函数
$filtered = array_filter(array,callback);
array的每个值被传递给命名为callback的函数。返回的数组只包含使函数返回true值的原始数组的元素
25.数组的高级用法
集合
求集合的并集:
function array_union($a,$b){
$union = array_merge($a,$b);
$union = array_unique($union);
return $union;
}
求集合的交集:
array_intersect();接收任意个数组作为参数,并且返回在每个数组中都存在的值的数组。如果有多个键有相同的值,保存值的第一个键。
求集合的差集:
array_diff()函数
堆栈
array_push()和array_pop()表示入栈和出栈
array_shift()和array_unshift()函数把数组作为队列对待
上一篇: C++ 笔记
推荐阅读
-
php数组中删除元素之重新索引,php数组元素索引_PHP教程
-
php数组函数之array_key_exists() 查找数组键名是否存在
-
php数组函数序列之array_keys() - 获取数组键名_PHP教程
-
php中数组之数据类型详解_PHP教程
-
php数组函数序列之in_array() - 查找数组中是否存在指定值
-
php数组函数序列之array_values() 获取数组元素值的函数与方法_PHP教程
-
photoshop学习 PHP学习之数组值的操作
-
php学习笔记之php数组小结
-
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值_PHP教程
-
php数组函数序列之in_array() 查找数组值是否存在