day7数组以及冒泡排序

来源:互联网 发布:黑马程序员52期百度云 编辑:程序博客网 时间:2024/05/21 06:44

数组基础:

php中,数组的下标可以是整数或者字符串

php中,数组的元素不是由下标决定,而是有加入的顺序决定。

定义:

array1,23,4,’323’)//可以存储任何数据,此时为默认下标

array(2=>1,5=>5, 3=>1)//下标可以为任何设定(无需顺序)(和python中的dict相似)

array2=>1,5, 1=>1.1, ‘abc’,0=>true)//可以加下标,也可以不加。混合下标是前面已经用过的最大数字下标+1.

Array(-2=>1,‘dd’=>5, 1.1,’abc’true)//负数下标不算在整数下标中,只能当做字符下标。这里最后三项的下标是0,1,2.

array2.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

array2=>1,true=>1.1, false=>true) // true当做1false当做0看待

array2=>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’=>array18,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);移动指针到下一个元素

}

//方法2for+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也是正常的循环语法结构,可以有breakcontinue等操作

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,159,11)

array(5,3, 4, 9 ,15, 11)


隐含的逻辑(假设数组有n项):

1.需要进行n-1趟的冒泡比较过程。

2.每一趟的比较都比前一趟少一次,第一趟需要比较n-1

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;    }}