数组
php的数组十分特殊,确切的说,它是由键值对构成的数组,就类似于C++的map,但是仍然可以用不带键的序列去表示正常的数组。
创建数组
- $arr1 = array(key1=>value1,key2=>value2);
- $arr2 = array(value1,value2,value3);
- $arr3 = [key1=>value1,key2=>value2];
- $arr4 = [value1,value2,value3];
注意点:
- 其中数组的key可以写,也可以不写。
- 数组的key存在时,只能时integet或者string类型,如果是其它类型,会自动强制转换成integer类型或者string类型,但是value可以是任何类型。当数组没有key时,会默认从下标0开始设置key
- 数组中相同的key的项,后面的会覆盖前面的。
- 数组可以同时存在带key的项,和不带key的项。不带key的项,自动为key设置为int类型,且这个key的数字是根据自己左边第一个key是int来决定的。假设这个数字是1,那么自己的key就默认是2,假设左边没有一个key是int的,自己的key就是0(从当前位置向左找,不是直接从开头找)
$arr1 = array(1,2,3,4);//不带key的
print_r($arr1);//0=>1 1=>2 2=>3 3=>4
$arr2 = array(1=>"d",2=>"z",3=>"p");//全是带key的
print_r($arr2);//1=>d 2=>z 3=>p
$arr3 = array("f1"=>1,"f2"=>2,2=>4,3,10=>"4");//混合存在key和不存在key的
print_r($arr3);//f1=>1 f2=>2 2=>4 3=>3 10=>4
/*----------key不是int/string类型的数组,key自动转换为int/string-----------*/
$arr4 = array(1.99=>1,1.1=>2,3,false=>"4");
print_r($arr4);//1.99被转换为1,1.1也被转换为1,所以后面的覆盖前面的1=>2 false被转换为0,所以0=>"4";
数组添加元素
添加元素的格式
- 数组变量[key] = value
添加元素的注意点
- 当数组中存在对应的key时,那么它的value会被新插入的覆盖。
$arr = array(1=>"d",2=>"z");
print_r($arr)//1=>d 2=>z;
$arr[1] = "z";
print_r($arr);//1=>z 2=>z;
数组删除元素
删除元素的格式
- unset(数组变量[key]);
删除元素的注意点
- 当数值删除对应的元素时,数组不会立马重新排序,原来的int类型的key还是保持原样。
- 如果需要让数组删除元素后,重新排序,需要用array_values(数组名)去将值拷贝到新数组里
数组变量);
$arr = array(1,2,3);
print_r($arr);
unset($arr[0]);
print_r($arr);//1=>2 2=>3
$newarr = array_values($arr);
print_r($newarr);//0=>2 1=>3
数组修改和查找元素
修改元素的格式
- 数组变量[key] = value
数组元素的修改就是利用覆盖之前对应key的值去修改。
查找数组的元素
- echo 数组变量[key];
$arr = array(1=>"d",2=>"z");
print_r($arr)//1=>d 2=>z;
$arr[1] = "z";
print_r($arr);//1=>z 2=>z;
echo($arr[1])//z;
数组的遍历
数组的遍历我们通常采用for循环遍历和php自带的foreach进行遍历。
php也是有数组指针的,用来指向当前数组的元素的位置,下面列出几个数组指针的函数
key(数组):获取当前数组指针指向的key
current(数组):获取当前数组指针指向的key
reset(数组):将当前数组指针指向第一位
next(数组):将当前数组指针下移一位
count(数组):返回数组元素个数
有了数组指针我们才可以用for遍历关联数组,下面分别是for和foreach遍历索引数组和关联数组,其中foreach数组的本质就是逐个取出数组的每一个键值对
$arr1 = array(1,2,3,4);//索引数组
$arr2 = array("aaa"=>"123","bbb"=>"ddd");
//for循环遍历索引数组
for($i=0;$i<count($arr1);$i++)
{
echo $arr1[$i];
}
//for循环遍历关联数组
reset($arr2);
for($i=0;$i<count($arr1);$i++)
{
echo key[$arr2]." ".current[$arr2];
next($arr2);
}
//foreach循环遍历索引数组
foreach($arr1 as $key=>$value)
{
echo $key." ".$value;
}
//foreach循环遍历索引数组
foreach($arr2 as $key=>$value)
{
echo $key." ".$value;
}
对比后,我们可以发现for遍历索引数组方便,遍历关联数组还需要数组指针,因为索引不是从0开始的,而且它遍历索引数组,还得要去索引数组是从0开始连续的。而foreach进行数组遍历,不管索引数组还是关联数组都是一套代码完成的。因此我们更推荐使用foreach进行数组遍历
数组的其它操作
list()将数组的值赋给多个变量
格式:
$arr = array(1,2,3,4,5);
list[$a,$b,$c] = $arr;//a = 1,b = 2,c = 3
注意点:
数组必须是索引从0开始的所以数组
array-values()
array-values(数组)将数组的所有值重新保存在一个新数组里,返回值是一个保存数据的数组。
注意点:只会保存原来数组的值,新数组是一个索引从0开始的递增数组。
$arr1 = array(2,3,4);
$newarr = array-values($arr1);
print_r($newarr);//0=>2 1=>3,2=>4;
array-keys()
array-keys(数组)将数组的所有键值key重新保存在一个新数组里,返回值是一个保存所有key的数组。
注意点:只会保存原来数组的key,新数组是一个索引从0开始的递增数组。
$arr1 = array("ddd"=>2,0=>3,"fff"=>4);
$newarr = array-keys($arr1);
print_r($newarr);//0=>ddd 1=>0,2=>fff;
array_key_exist()
array_key_exist(key,数组),用来判断数组是否有这个key(键值),返回值是bool
$arr1 = array(2,3,4);
echo array_key_exist(1);//true
in_array()
in_array(value,数组),用来判断数组是否有某个value值,返回值是bool
$arr1 = array(2,3,4);
echo array_key_exist(3);//true
array_search();
array_search(value,数组),用来判断数组是否有某个value值,返回值是这个值的key
$arr1 = array(2,3,4);
echo array_search(3);//1
array_count_values();
array_count_values(数组),用来统计数组每个值出现的次数,返回的是一个新数组,保存原数组每个值出现的次数,因为新数组的键值就是原数组的value,所以待统计数组的value,必须是int/string类型的
$arr = array("aaa",1,"aaa","1","bbb");
$newarr = array_count_values($arr);
print_r($newarr);//arr=>2 1=>2 bbb=>1
array_unique()
array_unique(数组),用于删除数组里重复出现值的项,后面重复出现的项会被删除掉
$arr = array("aaa",1,"aaa","1","bbb");
$newarr = array_unique($arr);
print_r($newarr);//0=>arr,1=>1 2=>bbb;
range(起始,结束,步长)
$arr = range(0,9);//创建一个起始从0到9的数组
print_r($arr);//0,1,2,3,4,5,6,7,8,9
array_sum(数组)
array_sum()//返回数组所有元素值的和
echo array_sum(array(1,2,3));//6
数组结合回调函数
通过回调函数把数组结合起来,可以十分灵活的处理数组的数据,既可以改变数组的数据,又可以间接访问数组的数据。
array_filter(数组,回调函数);
array_walk(数组,回调函数);
array_filter()用于过滤数组的元素,其内部的回调函数是返回值应该是bool,返回值是一个数组,保存筛选后的元素
array_walk()是对数组每个元素进行不同的操作,比较灵活。
//寻找偶数
function even($num)
{
if($num%2==0)
{
return true;
}else{
return false;
}
}
//加法,参数是饮用传递
function add1(&$num)
{
$num += 1;
}
$arr = array(1,2,3,4);
array_filter($arr,"even");//2,4
array_walk($arr,"add1");
print_r($arr);//2,3,4,5;
数组的排序
下面数组的排序都是直接操作原数组的
sort(数组);//按照值从小到大排序,原数组的键值被破坏。键值成为从0递增
rsort(数组);//按照值从大到小排序,原数组的键值被破坏。键值成为从0递增
$arr = array("bbb"=>10,"cc"=>9);
sort($arr);
print_r($arr);//0=>9 1=>10;
ksort(数组);//按照key从小到大排序
krsort(数组);//按照key从大到小排序
$arr = array("bbb"=>10,"cc"=>9);
ksort($arr);
print_r($arr);//bbb=>10 cc=>9;
asort(数组)//按照值从小到大排序,但是索引不会被破坏
arsort(数组)//按照值从大到小排序,但是索引不会被破坏
$arr = array("bbb"=>10,"cc"=>9);
asort($arr);
print_r($arr);//cc=>9 bbb=>10;
array_multisort(数组1,SORT_DESC/SORT_ASC,数组2,SORT_DESC/SORT_ASC);//对多个数组进行值的升序或者降序排序,每个数组后面的是升序或者降序
$arr1 = array(1,2,3);
$arr2 = array("bb","dd","aaa");
array_multisort($arr1,SORT_DESC,$arr2,SORT_ASC)//对arr1数组降序,arr2数组升序
print_r($arr1);//3 2 1
print_r($arr2);//aaa bb dd
数组模拟栈
array_push(数组,值):入栈,返回数组当前长度
array_pop():出栈,返回出栈元素
$arr18 = array(1,2,3);
array_push($arr18,4);
print_r($arr18);//1 2 3 4
array_pop($arr18);
print_r($arr18);//1 2 3
数组模拟队列
array_shift(数组):出队列,返回出队列的值
array_push(数组,元素):入队列
$arr19 = array(1,2,3);
array_push($arr18,4);
echo array_shift($arr18);//1
print_r($arr19);//2 3 4