数组基础:
php中,数组的下标可以是整数或者字符串
php中,数组的元素不是由下标决定,而是有加入的顺序决定。
定义:
array(1,23,4,’323’)//可以存储任何数据,此时为默认下标
array(2=>1,5=>5, 3=>1)//下标可以为任何设定(无需顺序)(和python中的dict相似)
array(2=>1,5, 1=>1.1, ‘abc’,0=>true)//可以加下标,也可以不加。混合下标是前面已经用过的最大数字下标+1.
Array(-2=>1,‘dd’=>5, 1.1,’abc’,true)//负数下标不算在整数下标中,只能当做字符下标。这里最后三项的下标是0,1,2.
array(2.7=>1,‘dd’=>5, 1=>1.1, ‘abc’, 0=>true) //浮点数下标会自动转换成整数并且自动抹除掉小数。
Array(‘2.7’=>1,’dd’=>5,’11’=>1.1,’abc’,true) //纯数字下标当做整数看待。
//此时下标为2,‘dd’,11,12,13
array(2=>1,true=>1.1, false=>true) // true当做1,false当做0看待
array(2=>1,2=>1.1) //下标重复,则单纯覆盖前面同名下标的值
其他:
$arr1[]= 1;
$arr1[]= 5;
$arr1[]= 10;
//直接在变量后面使用[],就能成为数组并且依次赋值。
$
取值:
通过下标。
数组的分类:
从键值关系:
关联数组:通常是指下标为字符串,而且该字符串大体可以来表达出数据的含义的数组
例:$person= array(
‘name’= >’笑话’,
‘age’=>18,
‘deu’=> ‘大学’,
)
索引数组:通常是指下标为从0开始的连续的数字。
从数组层次来分:
一维数组:
就是一个数组的每一个元素值,都是一个普通值(非数组值)
$arr1= array(
‘name’= >’笑话’,
‘age’=>18,
‘deu’=> ‘大学’,)
二维数组:一个数组中的每一项都是一个一维数组
$arr1= array(
‘name’= >array(’笑话’,’小明‘),
‘age’=>array(18,34),
‘deu’=> array(‘大学’,’gaozhogn’)
)
多维数组:
依次类推。
数组遍历:
遍历基本语法:[]代表可以省略部分
foreach($arras [$key=>] $value){//只能在索引数组使用
//这里就可以对$key和$value进行所有可能的操作
//$key代表所取得的元素的下标。,可能是数子,也可能是字符串。
//$value代表所取得元素的值。可能是各种类型。
//次循环结构会从数组的第一项一直遍历到最后一项然后结束。
}
数组指针和遍历原理:
每个数组,其内部有一个指针,该指针决定了该数组取值的时候取到的
元素。foreach遍历进行过程中,都是以来该指针进行的。
举例:array(2=>1,‘dd’=>5, 1=>1.1,’abc’, 0=>true)
下标: 2 ’dd‘ 1 3 0
值: 1 5 1.1 abc true
指针除了扶着foreach循环之外,还有其他函数依赖该指针。
1.$v1= current($arr1); //取得$arr1中当前指针所指向元素的值,如果没有指向元素,为false
2.$v1= key($arr1); //取得$arr1中当前指针所指向的元素的下标
3.$v1 = next($arr1); //将指针移向下一个元素
4.$v1 = prev($arr1); //将指针指向上一个元素
5.$v1= reset($arr1); //将指针指向第一个元素,然后取得钙元素的值
6.$v1= end($arr1); //将该指针指向最后一个元素,然后取得该元素的值
7.$v1= each($arr1); //取得当前元素的下标和值,并且移动到下一个元素。
for+next+resest遍历数组:
for($i=0;$i<count($arr1);$i++){
$key= key($arr1); //下标
$value= current($arr1); //值
//然后这里就应该移动指针
next($arr1);移动指针到下一个元素
}
//方法2:for+next语法 $max_num = reset($arr1); $len = count($arr1); for ($i =0; $i <$len; ++$i){ $k = key($arr1); $v = current($arr1); if ($v >$max_num){ $max_num = $v; } next($arr1); while+each()+list()遍历数组:
each()函数:
each()函数可以取得一个数组中的一个元素的下标和值,然后再放入一个新的数据中。
该新数组有4个元素,但储存的是下标和值的双份:
$arr1=array(3,8=>5,'dd1'=>6,2,11=>9,4);
$a1 = each($arr1);//取得数组的当前项的下标和值,并放入数组$a1,并移动指针到下一个。 echo "<pre>"; print_r($a1); echo "</pre>"; $a2 = each($arr1); print_r($a2);
Array
( [1] => 取出来的值 [value] => 取出来的值 [0] => 取出来的下标 [key] => 取出来的下标 )
list()函数
使用形式:
list($v1,$v2,$v3, $v4…) =数组$arr1;
list只能取从0开始的数字下标数组(但并非要求所在的数组按照严格的顺序)
例如:
$arr2=array(3=>5,0=>15,1=>34,2=>4);
//依次取得数组$arr1下标中1,2,3,4中的值。
$arr2 = array(5, 15, 3,4); list($v1, $v2, $v3, $v4) = $arr2; echo "<br/>v1=$v1, v2=$v2, v3=$v3, v4 =$v4";//v1=5, v2=15, v3=3, v4 =4
然后开始使用2个函数和while循环来实现数组遍历:
形式:
reset($arr1);
while(list($key,$value)=each($arr1))//从数组中$arr1取出下标和值
//当each到数组最后的时候,返回false
{
//这里就可以对$key,$value进行使用
}
foreach遍历细节探讨:
1.foreach也是正常的循环语法结构,可以有break和continue等操作
2.遍历过程中值变量默认的传值方式是值传递。
3.遍历过程中值变量可以人为设定为引用传递。foreach($arras $key=>&$value){….}
foreach中如果值变量是引用传递,则无论如何都是在原数组上进行。
$arr2 = array(3=>5, 0=>15, 1=>34,2=>4); foreach ( $arr2 as $key=>&$value){ $value *= 2; echo "<br/>$key=>$value"; } print_r($arr2);
输出结果:
3=>10
0=>30
1=>68
2=>8
Array( [3] => 10 [0] => 30 [1] => 68 [2] => 8 )
4.foreach默认是原数组上进行遍历,如果在遍历过程中对数组进行了某种修改或者指针性操作,则会
复制数组后在复制的数组上继续遍历循环。
$arr2 = array(5, 15, 3, 4); foreach ($arr2 as $key =>$value){ if ($key==1) { //操作值为15的这一项,但指针已经到下一个 //$arr2[$key] = $value * 2; $arr2[] = 100;关键在这里!此时认为foreach认为$arr2认为不再是 //外界$arr2,而是进行了一个复制拷贝。因为此时$arr2已经变成了含有100的数组。 也就是说,直接在循环的时候改变数组,不会影响循环结果。 } echo "<br/>$key=>$value"; } echo "<pre>"; print_r($arr2); echo "</pre>"; //并且可以看到原来的数组停留的位置(指针) $key1 = key($arr2); $value1 = current($arr2); echo "<br/>key1=$key1, value1 = $value1";
结果是:
0=>5
1=>15
2=>3
3=>4
Array ( [0] => 5 [1] => 15 [2] => 3 [3] => 4 [4] => 100 )
key1=0,value1 = 5
数组的排序思想:
冒泡排序:
目标:将该数组从小到大排列出来。
$arr2= array(5, 15, 3, 4, 9, 11);
一般性逻辑描述:
1.从该数组第一个元素开始,从左到右相邻的2个元素边角大小。如果左边的比右边大,
则将他们交换位置,结果:
array(5,15, 3, 4, 9, 11);
array(5,3,15, 4, 9, 11);
array(5, 3,4,15,9,11)
array(5,3, 4, 9 ,15, 11)
隐含的逻辑(假设数组有n项):
3.每一趟比较都是从数组的开头(0)开始,跟紧挨的元素比较,并进行交换。
function bubble_sort(&$arr){ //需要进行n-1趟的冒泡比较过程。 for ($i=0; $i<count($arr)-1; $i++){//设定比较的趟数 //每一趟的比较都比前一趟少一次,第一趟需要比较n-1次 for ($j =0; $j<count($arr)-$i-1;$j++){//设定本趟比较的次数 //跟紧挨的元素进行比较 if ($arr[$j]>$arr[$j +1]){ swap($arr[$j], $arr[$j+1]); } } } } 选择排序: 将下列数组按照从小到大排列出来 $arr2 = array(5, 15, 3, 4, 9, 11) 一般性逻辑描述: 第一趟:取得该数组中的最大值及其下标,然后跟该数组中最后一项交换(倒数第一项确定) 第二趟:取得该数组中除最大一项的值及其下标,然后跟倒数第二项交换。 function xuanze_sort(&$arr){ for ($i=0;$i<count($arr)-1; ++$i){//总共比较n-1次 $max_index = 0; for ($j=0;$j<count($arr)-$i;++$j){//第一次比较n个数,第二次比较n-1个数,第m次比较n-m+1个数。 if ($arr[$j] > $arr[$max_index]){ $max_index = $j; } } $temp = $arr[$max_index]; $arr[$max_index] = $arr[count($arr)-$i-1]; $arr[count($arr)-$i-1] = $temp; } }