最近刚刚实习,经常用到php的数组,所以总结一下,以后不用随时去乱搜。
一:基础知识
PHP支持数字索引数组和关联数组,关联数组允许使用更有意义的数据(如字符串)作为索引。以及允许间隔性地使用数组和字符串作为数组的索引。
1、数组定义:
$arr = [1,2,3,4];//数字索引数组 php5.4以上提供的新方式 $arr = [‘a‘=>1,‘b‘=>2];//关联索引数组 $arr = array(1,2,3,4); $arr = array(‘a‘=>1,‘b‘=>2); $arr = range(1,n);//自动创建1~n的数字数组
PHP的数组不需要预先初始化或创建,在第一次使用时就会自动的创建如:
$arr[‘a‘] = 1; $arr[‘b‘] = 2; $arr[‘c‘] = 3;
2、数组的遍历
- for循环
只能用于有序的数字索引数组for($i = 0;$i<count($arr);$i++){ echo $arr[$i]; }
- foreach
for($arr as $key=>$value){ echo $key."--".$value; }
- each
while($ele = each($arr)){ echo ele[‘key‘]."--".ele[‘value‘]; }
- list(常用)
reset($arr);//重置指针 while(list($key,$value) = each($arr)){ echo $key."--".$value; }
3、二维或多维数组
$arr = array( ‘a‘ =>array(); ‘b‘ =>array(); );
4、数组定义需要注意(来源于PHP手册)
key 会有如下的强制转换:
1、包含有合法整型值的字符串会被转换为整型。例如键名 “8” 实际会被储存为 8。但是 “08” 则不会强制转换,因为其不是一个合法的十进制数值。
2、 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
3、 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
4、Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
5、数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
6、如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
$array = array( 1 => "a", "1" => "b", 1.5 => "c", true => "d", ); var_dump($array); //结果 array(1) { [1]=> string(1) "d" }
二:数组的排序
排序是数组操作中用到最频繁的操作。php提供了很多排序函数。
一:维数组的排序函数
1、sort():可以对一维的数组进行升序排序,如果是数字,则按从小到大排,如果是字符串,则按首字母表排
2、asort():对关联数组进行value的升序
3、ksort():对关联数组进行key的升序
以上三个函数对应的反序函数为rsort(),arsort(),krsort();按降序来排
4、array_reverse():将数组反向
5、shuffle():将数组各元素进行随机排序
二:多维数组的排序
使用sort(),ksort()等函数,可以对一维的数组进行关键字,按值,以及逆向排序等,但是这些函数不能用于多维数组。此时就需要使用用户自定义的排序函数了。
PHP提供了usort(),uasort(),uksort(),函数来对二维数组进行排序,这些函数需要我们自己定义一个排序函数,然后传给它。自定义的函数需要接受两个参数,并返回哪个参数应该排在前面(默认按升序来排):false或负数则第一个参数排前面,true或正数则第二个参数排前面,相等为0。如果要反序,执行将返回值交换
//代码测试 $arr = array( array(‘key1‘=>900,‘key2‘=>‘bash1‘), array(‘key1‘=>800,‘key2‘=>‘heh2‘), array(‘key1‘=>950,‘key2‘=>‘gosh4‘), ); var_dump($arr); function asc_number_sort($x,$y){ if($x[‘key1‘]>$y[‘key1‘]){ return true; }else if($x[‘key1‘]=$y[‘key1‘]){ return false; }else{ return 0; } } usort($arr,‘asc_number_sort‘); var_dump($arr); //测试结果 array (size=3) 0 => array (size=2) ‘key1‘ => int 900 ‘key2‘ => string ‘bash1‘ (length=5) 1 => array (size=2) ‘key1‘ => int 800 ‘key2‘ => string ‘heh2‘ (length=4) 2 => array (size=2) ‘key1‘ => int 950 ‘key2‘ => string ‘gosh4‘ (length=5) array (size=3) 0 => array (size=2) ‘key1‘ => int 800 ‘key2‘ => string ‘heh2‘ (length=4) 1 => array (size=2) ‘key1‘ => int 900 ‘key2‘ => string ‘bash1‘ (length=5) 2 => array (size=2) ‘key1‘ => int 950 ‘key2‘ => string ‘gosh4‘ (length=5)
- PHP会将内层的数组不断的发送给这个函数,从而将其排序
- usort()函数根据数值来进行排序,但是它不会保存外层数组的关键字
- 如果我们将数组改为:
$arr = array( ‘xc‘ => array(‘key1‘ => 900, ‘key2‘ => ‘bash1‘), ‘as‘ => array(‘key1‘ => 800, ‘key2‘ => ‘heh2‘), ‘dw‘ => array(‘key1‘ => 950, ‘key2‘ => ‘gosh4‘), );测试结果为:array (size=3) 0 => array (size=2) ‘key1‘ => int 800 ‘key2‘ => string ‘heh2‘ (length=4) 1 => array (size=2) ‘key1‘ => int 900 ‘key2‘ => string ‘bash1‘ (length=5) 2 => array (size=2) ‘key1‘ => int 950 ‘key2‘ => string ‘gosh4‘ (length=5)
可以发现最外层数组的关键字’xc’,’as’,’dw’没有保存下来
使用uasort()函数可以保存关键字
uasort($arr, ‘asc_number_sort‘); array (size=3) ‘as‘ => array (size=2) ‘key1‘ => int 800 ‘key2‘ => string ‘heh2‘ (length=4) ‘xc‘ => array (size=2) ‘key1‘ => int 900 ‘key2‘ => string ‘bash1‘ (length=5) ‘dw‘ => array (size=2) ‘key1‘ => int 950 ‘key2‘ => string ‘gosh4‘ (length=5)
- 当使用uksort()函数时;,排序将基于关键字
三:实际使用遇到的一些问题
1、json数组和PHP数组看似很像,实际上并不相同,需要用到
json_decode()函数将json转化为php数组(需要注意编码问题)
2、在数组中如果需要进行if等判断,需要让判断提前跳出,不要将大段逻辑写入了if中。
3、 数组取值:数组从小到大排序,要取最大的n个值应该从后面取
$arr.slice(-n);
PHP数组函数
array() 创建数组。
array_change_key_case() 把数组中所有键更改为小写或大写。
array_chunk() 把一个数组分割为新的数组块。
array_column() 返回输入数组中某个单一列的值。
array_combine() 通过合并两个数组来创建一个新数组。
array_count_values() 用于统计数组中所有值出现的次数。
array_diff() 比较数组,返回差集(只比较键值)。
array_diff_assoc() 比较数组,返回差集(比较键名和键值)。
array_diff_key() 比较数组,返回差集(只比较键名)。
array_diff_uassoc() 比较数组,返回差集(比较键名和键值,使用用户自定义的键名比较函数)。
array_diff_ukey() 比较数组,返回差集(只比较键名,使用用户自定义的键名比较函数)。
array_fill() 用给定的键值填充数组。
array_fill_keys() 用指定键名的给定键值填充数组。
array_filter() 用回调函数过滤数组中的元素。默认去除数组中的空值
array_flip() 交换数组中的键和值。
array_intersect() 比较数组,返回交集(只比较键值)。
array_intersect_assoc() 比较数组,返回交集(比较键名和键值)。
array_intersect_key() 比较数组,返回交集(只比较键名)。
array_intersect_uassoc() 比较数组,返回交集(比较键名和键值,使用用户自定义的键名比较函数)。
array_intersect_ukey() 比较数组,返回交集(只比较键名,使用用户自定义的键名比较函数)。
array_key_exists() 检查指定的键名是否存在于数组中。
array_keys() 返回数组中所有的键名。
array_map() 把数组中的每个值发送到用户自定义函数,返回新的值。
array_merge() 把一个或多个数组合并为一个数组。
array_merge_recursive() 递归地合并一个或多个数组。
array_multisort() 对多个数组或多维数组进行排序。
array_pad() 用值将数组填补到指定长度。
array_pop() 删除数组的最后一个元素(出栈)。
array_product() 计算数组中所有值的乘积。
array_push() 将一个或多个元素插入数组的末尾(入栈)。
array_rand() 返回数组中一个或多个随机的键。
array_reduce() 通过使用用户自定义函数,以字符串返回数组。
array_replace() 使用后面数组的值替换第一个数组的值。
array_replace_recursive() 递归地使用后面数组的值替换第一个数组的值。
array_reverse() 以相反的顺序返回数组。
array_search() 搜索数组中给定的值并返回键名。
array_shift() 删除数组中首个元素,并返回被删除元素的值。
array_slice() 返回数组中被选定的部分。
array_splice() 删除并替换数组中指定的元素。
array_sum() 返回数组中值的和。
array_udiff() 比较数组,返回差集(只比较值,使用一个用户自定义的键名比较函数)。
array_udiff_assoc() 比较数组,返回差集(比较键和值,使用内建函数比较键名,使用用户自定义函数比较键值)。
array_udiff_uassoc() 比较数组,返回差集(比较键和值,使用两个用户自定义的键名比较函数)。
array_uintersect() 比较数组,返回交集(只比较值,使用一个用户自定义的键名比较函数)。
array_uintersect_assoc() 比较数组,返回交集(比较键和值,使用内建函数比较键名,使用用户自定义函数比较键值)。
array_uintersect_uassoc() 比较数组,返回交集(比较键和值,使用两个用户自定义的键名比较函数)。
array_unique() 删除数组中的重复值。
array_unshift() 在数组开头插入一个或多个元素。
array_values() 返回数组中所有的值。
array_walk() 对数组中的每个成员应用用户函数。
array_walk_recursive() 对数组中的每个成员递归地应用用户函数。
arsort() 对关联数组按照键值进行降序排序。
asort() 对关联数组按照键值进行升序排序。
compact() 创建包含变量名和它们的值的数组。
count() 返回数组中元素的数目。
current() 返回数组中的当前元素。
each() 返回数组中当前的键/值对。
end() 将数组的内部指针指向最后一个元素。
extract() 从数组中将变量导入到当前的符号表。
in_array() 检查数组中是否存在指定的值。
key() 从关联数组中取得键名。
krsort() 对数组按照键名逆向排序。
ksort() 对数组按照键名排序。
list() 把数组中的值赋给一些变量。
natcasesort() 用“自然排序”算法对数组进行不区分大小写字母的排序。
natsort() 用“自然排序”算法对数组排序。
next() 将数组中的内部指针向前移动一位。
pos() current() 的别名。
prev() 将数组的内部指针倒回一位。
range() 创建包含指定范围单元的数组。
reset() 将数组的内部指针指向第一个元素。
rsort() 对数组逆向排序。
shuffle() 将数组打乱。
sizeof() count() 的别名。
sort() 对数组排序。
uasort() 使用用户自定义的比较函数对数组中的键值进行排序。
uksort() 使用用户自定义的比较函数对数组中的键名进行排序。
usort() 使用用户自定义的比较函数对数组进行排序。