欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP程序设计读书笔记十之数组

程序员文章站 2022-04-02 23:22:35
数组: 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()函数把数组作为队列对待