今天学习了数组的相关知识。
一、数组
1.数组的定义
什么是数组呢?数组其实就是一组数据的集合,我们可以根据数组中的下标值(也就是键值关系)来取出我们想要数据。数组的定义通常有两种方式:
方法1: $arr = array(10,20,30,40,50);
方法2: $arr[] = 10;
$arr[] = 11;
$arr[] = 12;
通过以上的方式可以创建数组并且给数组赋值。被创造的数组就类似于一个小的仓库,我们可以随时去仓库里面找我们想要的数据。
2.数组的分类
数组可以根据其下标(键值关系)的不同分为三类:枚举数字,关联数组,混合数组。
枚举数字:也被称为索引数组,其主下标是一组从零开始的正整数(与其他语言中的数组类似)。比如:
$arr= array(11,22,33,44,55,66,77);
//上面的数组的下标就是从零开始的正整数依次为0,1,2,3,4,5,6
关联数组:数组的下标是字符串,这类字符串通常代表一定的含义,可以更方便的去取数据。比如:
$arr1 = array(
"name" => "localhost",
"psd" => 123456,
"username"=> "root"
);
以上这类数组就是关联数组。
混合数组:既有数字下标,也有字符下标的数组,比如:
$arr = array(
1=>1,
2=>2,
"user"=>"很shape",
"psd"=>123456
);
以上的数组就是混合数组。
注意:1.如果数组元素中没有设定索引值,则其下标为当前最大索引+1;
2.如果下标为浮点数,则会向下取整。
3.下标如果有重复,则后面的数会覆盖前面的数。
4.php的数组,最后一项的逗号可以有,并不代表单独的一项。
5.数组单元的顺序,是由数组中放入的顺序决定的,而不是其下标。
3.多维数组
多维数组其实就是多个数组相互嵌套所形成的数组,如下:
$arr = array(
array(1,2,3,4,5,6,7,88,99),
"abc"=>array(11,22,33,44,55),
2=> array(55,66,77,88,99),
"def"=>array("aa"=>"aa","bb"=>"bb","cc"=>"cc")
);
上面的数组就是一个常见的二维数组;
4.数组的基本用法
1)求一个一维数组的平均值;
$a = array(1,2,3,4,5,6,7,8,9);
$len = count($a); //这个数组的长度
$sum = 0; //用于总和
$c = 0; //用于储存数的个数
for($i=0;$i<$len;++$i){
$sum += $a[$i]; //累加器
++$c; //计数器
}
echo "平均值为".($sum/$c);
2)求一个二维数组的平均值
$aa = array( //二维数组
array(11,22,33),
array(22,33,44),
array(222,222,333,444
);
$len = count($aa); //获取$aa的长度
$sum = 0; //用于总和
$c = 0; //用于计数
for($i=0;$i<$len;++$i){ //循环第一层数组
$t = $aa[$i]; //取出第i个数组
$len2 = count($t); //获得第i个数组的长度
for($k=0;$k<$len2;++$k){ //循环第i个数组
$sum += $t[$k]; //循环累加所有数组的所有项
++$c; //计数一共有多少项
}
}
echo "平均值".($sum/$c);
3)求一个一维数组的最大值
$arr = array(10,52,85,32,1,5,4,632,5);
$max = $arr[0]; //先将第一项放入$max中,假设第一项为最大
$pos = 0; //假设第第一项最大,下标为0;
$len = count($arr); //获取数组的长度
for($i=0;$i<$len;++$i){ //遍历数组
if($arr[$i]>$max){ //将每一项与最大值进行对比
$max = $arr[$i]; //将新的最大值赋值给$max
$pos = $i; //最大值的下标付给$pos
}
}
echo "最大值:".($max);
echo "最大值下标是".($pos);
二、数组的方法
1.数组的遍历的方法
数组遍历的方法有许多,我们首先来看第一个
foreach( $数组变量名 as 【$key =>】 $value ){
//循环体;这里可以去“使用”$key 和 value;
}
注意:
1)$key 和 $value 就是该遍历语句一次次取得的数组的每一个单元(项)的下标和对应值。而且,它总是从数组的开头往后按顺序取数据。
2)foreach也是正常的循环语法结构,可以有break和continue等操作。
3)遍历过程中值变量默认的传值方式是值传递。
4)遍历过程中值变量可以人为设定为引用传递:foreach($arr as $key => &$value){ ... }
5)foreach默认是原数组上进行遍历。但如果在遍历过程中对数组进行了某种修改或某种指针性操作,则会复制数组后在复制的数组上继续遍历循环(原数组保持不变)。
6)foreach中如果值变量是引用传递,则无论如何都是在原数组上进行。
foreach的主要原理就是运用内部指针的指向来遍历的,默认情况下,该指针是指向第一项的,数组中如果没有指定下标,则在操作过程就是通过指针的指向来进行操作的,所谓的遍历就是一次次取得当前单元的键和值,并放入对应的变量$key和$value中,然后将指针移到下一个单元。
数组是一个总体数据,可以对指针进行操作的函数有:
current($arr); 获得数组的当前指针所在单元的值
key($arr); 获得数组的当前指针所在单元的值
next($arr); 先将数组的指针移向下(后)一个单元,然后取得该新单元的值;
prev($arr); 先将数组的指针移向上(前)一个单元,然后取得该新单元的值;
end($arr); 先将数组的指针移向最后单元,然后取得该新单元的值;
reset($arr); 先将数组的指针移向第一个单元,然后取得该新单元的值;
2.使用for和next遍历数组
在php数组中,往往不能单纯使用for循环进行遍历,for循环只能循环下标为连续纯整数的数组。
$arr = array(1=>3,"a"=>7,'bb'=>65);
$len = count($arr); //获取长度
for($i=0;$i<$len;++$i){ //循环数组
$key = key($arr); //获取当前单元的键
$value = current($arr); //获取当前单元的值
echo "$key =>$value"; //输出键值对
next($arr); //把指针下移
}
3.each函数的使用
each()函数的作用:先取得一个数组的“当前单元”的下标和值(并放入一个数组),然后将指针移到下一个单元。
$a = each($数组名); //此时$a就是一个数组了
举例:
$arr = array(1=>3,4=>5,'nihao'=>hh); //数组$arr
$b = each($arr); //获取指针第一项的键值对,给$b
$c = each($arr); //获取指针第二项的键值对,给$c
echo $b; //输出$b 结果为:array(0=>1,[key]=>1,1=>3,[value]=>3)
echo $c; //输出$c 结果为:array(0=>4,[key]=>4,1=>5,[value]=>5)
由此可见,由each函数变量数组的到的结果也是数组,可以根据此数组的键值来获取原数组中的键所对应的值。
4.list()函数的使用;
list()函数用于一次性取得一个数组中从0开始的数字下标的多个单元的值。
使用形式:
list($变量1,$变量2,......)=$数组;
注意:这里变量的个数,要跟该数组的数字下标的单元相对应,如果某个数组的相应下标不存在,则就会报错。
举例:
$a = array(0=>2,1=>3,5=>6,4=>6,3=44,2=>9);
list($c,$d,$e,$f,$g)=$a; //将$a数组中下标为0,1,2,3,4所对应的值分别赋值给$c,$d,$e,$f,$g;
echo "c=$c,d=$d,e=$e,f=$f,g=$g"; //输出:c=2,d=3,e=9,f=44,g=6;
通过以上原理,我们可以更好的进行扩展了:用while(),each(),list()来遍历数组。如:
$arr = array(1=>3,'aa'=>5,6=>7);
while(list($key,$value)=each($arr)){
echo "$key = $value"
}
上面的while,each,list方法的组合运用可以很好的进行数组的遍历,其作用和foreach一样。
三、数组的排序
1.常见的排序函数
2.冒泡排序算法
数组内部从小到大排序
$a = array (5,10,8,7,55,6,2,5,8,79,4,1,66)
$len = count($a);
for($i = 0;$i<$len-1;++$i){ //一共需循环$len-1次
for($k = 0;$k<$len-$i-1){//
if($a[$k]>$a[$k+1]){
$t=$a[$k];
$a[$k]=$a[$k+1];
$a[$k+1] = $t;
}
}
}
3.选择排序
数组内部从小到大排序
$a = array (5,10,8,7,55,6,2,5,8,79,4,1,66);
$len = count($a);
for($i = 0;$k<$len-1;++$i){
$max = $a[0];
$pos = 0;
for($k=0;$k<$len-$i;++$k){
if($a[$k]>$max){
$max = $a[$k];
$pos = $k;
}
}
$t = $a[$pos];
$a[pos] = $a[$len-$i-1];
$a[$len-$i-1] = $t;
}
今天就到这里。