一、数组初步
①概念:数组是一种数据的集合,数组主要是用于存储具有行列特征(表格)的数据
②PHP数组的分类
- 索引数组:数组的下标是整数
- 关联数组:数组的下标是字符串
③PHP数组的创建
- php中数组元素由两部分组成,键名【下标】和键值
- 索引数组的创建,可以显示创建,也可以隐式创建,创建的数组,下标可以不连续
- 关联数组的创建:,可以显示创建,也可以隐式创建
④多维数组:PHP中支持多维数组,如果一个数组的元素又是一个数组,那么这就是多维数组,实际开发中,一般二维数组比较常见
<?php //显式创建 $arr1=array( 'goods0'=>array('id'=>10,'brand'=>'mi5','price'=>1999), 'goods1'=>array('id'=>11,'brand'=>'mi6','price'=>2666), 'goods2'=>array('id'=>12,'brand'=>'note3','price'=>2199), 'goods3'=>array('id'=>13,'brand'=>'mi8','price'=>2999) ); $arr2=[ 'goods0'=>array('id'=>10,'brand'=>'mi5','price'=>1999), 'goods1'=>array('id'=>11,'brand'=>'mi6','price'=>2666), 'goods2'=>array('id'=>12,'brand'=>'note3','price'=>2199), 'goods3'=>array('id'=>13,'brand'=>'mi8','price'=>2999) ]; //隐式创建 $arr3=array(); $arr3['goods0']=array('id'=>10,'brand'=>'mi5','price'=>1999); $arr3['goods1']=array('id'=>11,'brand'=>'mi6','price'=>2666); $arr3['goods2']=array('id'=>12,'brand'=>'note3','price'=>2199); $arr3['goods3']=array('id'=>13,'brand'=>'mi8','price'=>2999); echo '<pre>'; print_r($arr1); print_r($arr2); print_r($arr3); ?>
⑤数组元素的访问
- 一维数组的访问:$数组名[ 下标/ '键名' ]
<?php //一维索引数组的访问 $arr1=[10,20,30,40]; echo $arr1[0],'<br>';//10 echo $arr1[1],'<br>';//20 echo $arr1[2],'<br>';//30 echo $arr1[3],'<br>';//40 //一维关联数组的访问 $arr2=array('id'=>10,'brand'=>'note3','price'=>1999); echo $arr2['id'],'<br>';//10 echo $arr2['brand'],'<br>';//note3 echo $arr2['price'];//1999 ?>
- 二维数组的访问:$数组名[ 行下标 ] [ 列下标 ]
<?php $arr=array( 'goods0'=>array('id'=>10,'brand'=>'mi5','price'=>1999), 'goods1'=>array('id'=>11,'brand'=>'mi6','price'=>2666), 'goods2'=>array('id'=>12,'brand'=>'note3','price'=>2199), 'goods3'=>array('id'=>13,'brand'=>'mi8','price'=>2999) ); echo $arr['goods1']['id'];//11 echo $arr['goods2']['brand'];//note3 echo $arr['goods3']['price'];//2999 ?>
⑥数组的长度:count($数组名)
<?php //一维数组的长度 $arr1=[10,20,30,40]; $arr2=array('id'=>10,'brand'=>'note3','price'=>1999); echo count($arr1);//4 echo count($arr2);//3 //二维数组的长度 $arr3=array( 'goods0'=>array('id'=>10,'brand'=>'mi5','price'=>1999), 'goods1'=>array('id'=>11,'brand'=>'mi6','price'=>2666), 'goods2'=>array('id'=>12,'brand'=>'note3','price'=>2199), 'goods3'=>array('id'=>13,'brand'=>'mi8','price'=>2999) ); echo count($arr3);//4----行数 echo count($arr3['goods0']);//3-----具体行的列数 ?>
二、数组的指针:用于表示当前所关注的元素
①current($arr)用于当前指针所指向的元素的键值
②key($arr)用于当前指针所指向的元素的键名
③next($arr)用于将数组的指针下移
④prev($arr)用于将数组的指针上移
⑤reset($arr)用于将数组的指针重置归位(默认位置是第一个元素)
⑥end($arr)用于将数组的指针移到最后的一个元素
<?php $arr=array('id'=>10,'brand'=>'note3','price'=>1999); echo key($arr),'=>',current($arr),'<br>';//id=>10----默认位置 next($arr); echo key($arr),'=>',current($arr),'<br>';//brand=>note3----向下移动 prev($arr); echo key($arr),'=>',current($arr),'<br>';//id=>10----向上移动 end($arr); echo key($arr),'=>',current($arr),'<br>';//price=>1999-----移到最后 reset($arr); echo key($arr),'=>',current($arr),'<br>';//id=>10-----重置归位 ?>
三、数组的遍历
①for循环:使用循环控制变量来模拟下标的方式来遍历数据,只能遍历连续或有规则的数组,但不能遍历下标不同且不规律的数组,或者是下标是字符串的关联数组
<?php $arr=[10,20,30,40,50]; for($i=0;$i<count($arr);$i++){ echo $arr[$i],'<br>';//10 20 30 40 50 } ?>
②foreach
- 语法: foreach($arr as 【$key=>】$value){ 循环体} $arr是数组,$key和$value是一个可以自己定义的变量
<?php $arr=array('id'=>10,'brand'=>'note3','price'=>1999); foreach($arr as $k=>$v){ echo $k,'=>',$v,'<br>';//id=>10 brand=>note3 price=>1999 } ?>
- foreach中没有出现类似于数组名【下标】这样的代码,所以foreach不是通过下标的方法来遍历数组,而是通过指针
- 原理:首先对数组的指针进行重置,然后读取当前指针所指向的数组元素,并将元素的键名赋值变量$key,将键值赋值给变量$value,同时会将数组下移一行(为了下一次循环),foreach不需要控制循环变量的次数,它会自动判断什么什么时候结束循环
③while-each-list:使用while循环,each函数,list语法结构联合来遍历数组
- each(数组) 用于获取当前指针所指向的元素键名和键值,数组返回,并以索引元素与关联元素两种形式表示,同时将指针下移一行
- list(变量列表)=$arr 将数组$arr中的索引元素赋值给变量列表中的变量
<?php $item=array('1'=> 10,'value' => 10,'0' => 'id','key' => 'id'); list($k,$v)=$item; echo $k,'<br>',$v;//id 10 ?>
- while-each-list 遍历数据,注意赋值语句也可以作为while的表达式判断条件
<?php $arr=array('id'=>10,'brand'=>'note3','price'=>1999); while(list($k,$v)=each($arr)){ echo $k,'=>',$v,'<br/>';//id=>10 brand=>note3 price=>1999 } ?>
- foreach和list连用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <?php //模拟从数据库得到的数据 $arr=[ [1,'xiaomi','mi8',2999], [2,'huawei','mate20',5999], [3,'Apple','x',8999], [4,'vivo','x20',3999] ]; ?> <body> <table border='1' rules='all'> <thead> <tr> <th>id</th> <th>品牌</th> <th>品名</th> <th>价格</th> </tr> </thead> <tbody> <?php foreach($arr as list($id,$brand,$name,$price)){?> <tr> <td><?php echo$id;?></td> <td><?php echo$brand;?></td> <td><?php echo$name;?></td> <td><?php echo$price;?></td> </tr> <?php }?> </tbody> </table> </body> </html>
四、数组操作常用的函数
①数组的长度:count(数组名)
②获取数组元素的键名和键值
- array_keys ( ) 获取数组元素的键名,数组返回
- array_values( ) 获取数组元素所有键值,数组返回
③判断键名和键值是否存在
- array_key_exists ( key,arr ) 用于判断某个键名key是否存在数组arr中
- in_array( value,arr ) 用于判断某个键值value是否存在数组arr中
<?php $arr=array('id'=>10,'brand'=>'note3','price'=>1999); $key=array_keys($arr); $value=array_values($arr); var_dump(array_key_exists('brand',$arr));//bool(true) var_dump(in_array('1999',$arr));//bool(true) ?>
- 扩展:使用isset( )和empty( )判断
<?php $arr=array('id'=>10,'brand'=>'note3','price'=>1999); if($arr['foo']){ echo $arr['foo']; }else{ echo '没有'; } //上面的输出结果是:Notice: Undefined index: foo in E:WAMPApache2.4htdocs est.php on line 3 没有 //这种类似于JavaScript的方式,虽然可以达到效果,但是会有警告 //只有当php.ini中display_errors=On 的时候,才会在页面上显示notice错误 //开发阶段一定设置为on,生产阶段(上线)设置为off //isset 也可以判断数组中是否有指定的键,isset会吞掉undefined index的警告 if(isset($arr['foo'])){ echo $arr['foo']; }else{ echo '没有'; } //上面的输出结果是:没有 //empty也可以达到和isset的效果 //empty($arr['foo'])相当于!isset($arr['foo']) || $arr['foo']==false if(empty($arr['foo'])){ echo '没有'; }else{ echo $arr['foo']; } //上面的输出结果是:没有 //补充一个JavaScript的容易出错的点 //在js的判断条件里: //0==false ------true //1==false ------false //'123'==false ------false //''==false ------false //'0'==false ------true(特别注意的点,它是先把字符串转为number0 ,然后在比较0==false,所以结果是true) ?>
④数组合并:array_merge ( 数组1,数组2,.....)
<?php $arrA=[10,20,30]; $arrB=['a','b','c']; $return=array_merge($arrA,$arrB); print_r($return);//Array ( [0] => 10 [1] => 20 [2] => 30 [3] => a [4] => b [5] => c ) ?>
⑤数组排序
- sort(数组)对数组按键值进行升序排序,原来的下标会改变
- rsort(数组)对数组按键值进行降序排序,原来的下标会改变
- asort(数组)对数组按键值进行升序排序,原来的下标不会改变
- rasort(数组)对数组按键值进行降序排序,原来的下标不会改变
⑥解压数组 :extract(数组)将关联元素转化为以键名为变量名的变量
<?php $arr=array('id'=>10,'brand'=>'note3','price'=>1999); extract($arr); echo $id,'<br>';//10 echo $brand,'<br>';//note3 echo $price,'<br>';//1999 ?>
⑦去掉重复的数组,指的是值相同 array_unique()
<?php $a=array("a"=>"red","b"=>"green","c"=>"red"); print_r(array_unique($a));//Array ( [a] => red [b] => green ) ?>
⑧将一个或多个元素追加到数组中 array_push(array,value1,value2...)
<?php $a=array("red","green"); array_push($a,"blue","yellow"); print_r($a);//Array ( [0] => red [1] => green [2] => blue [3] => yellow ) ?>
⑨删除数组最后一个元素 array_pop()
<?php $a=array("red","green","blue"); array_pop($a); print_r($a);//Array ( [0] => red [1] => green ) ?>
⑩搜索某个键值,并返回对应的键名 array_search(value,array,strict)
<?php //array_search() 函数与 in_array() 一样,在数组中查找一个键值。 //如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false。 //如果第三个参数 strict 被指定为 true,则只有在数据类型和值都一致时才返回相应元素的键名。默认是false $a=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"100"); echo array_search("red",$a);//a var_dump (array_search("yellow",$a));//bool(false) echo array_search(100,$a);//d----数字100,返回了d var_dump (array_search(100,$a,true));//bool(false)-----数字100和数字中的字符串100不一致,返回false ?>
五、数组的相关算法
①排序算法
- 冒泡排序法
<?php $arr=[15,25,10,2,8,5]; $len=count($arr); //外层循环控制轮数 for($j=1;$j<$len;$j++){ for($i=0;$i<$len-$j;$i++){ //内层循环比较并调换位置 if($arr[$i]>$arr[$i+1]){ //$arr[$i]表示当前元素 //$arr[$i+1]表示当前元素的下一个元素 $temp=$arr[$i]; $arr[$i]=$arr[$i+1]; $arr[$i+1]=$temp; } } } print_r($arr);//Array ( [0] => 2 [1] => 5 [2] => 8 [3] => 10 [4] => 15 [5] => 25 ) ?>
- 插入排序法
<?php $arr=[15,25,10,2,8,5]; //外层循环控制每次拿出第几个数进行比较 for($j=1;$j<count($arr);$j++){ $target=$arr[$j]; //内层循环控制数组的比较和调换位置 for($i=$j-1;$i>=0;$i--){ if($arr[$i]>$arr[$i+1]){ $arr[$i+1]=$arr[$i]; $arr[$i]=$target; } } } echo '<pre>'; print_r($arr);//Array ( [0] => 2 [1] => 5 [2] => 8 [3] => 10 [4] => 15 [5] => 25 ) ?>
②查找算法
- 顺序查找法
<?php $arr=[15,25,10,2,8,5]; $search=10; function showInfo($arr,$search){ $len=count($arr); for($i=0;$i<$len;$i++){ if($search==$arr[$i]){ return $i; } } } echo showInfo($arr,$search);//2 ?>
- 二分查找法(注意:此方法只适应于按数字大小顺序排列的数组)
<?php function binary($arr,$search){ $l=0; $r=count($arr)-1; while($l<=$r){ $m=ceil(($l+$r)/2); if($arr[$m]==$search){ return $m; }else if($search>$arr[$m]){ $l=$m+1; }else if($search<$arr[$m]){ $r=$m-1; } } return false; } $arr=[3,10,13,18,20,45,60,77,99,100]; $search=60; echo binary($arr,$search);//6 ?>