批改状态:合格
老师批语:数据的声明,赋值,遍历,更新等是最常用的操作
数组的种类与定义与访问方式
//数组分类:索引数组、关联数组、多维数组//1、索引数组:带有数字索引的数组$goods=[0=>'1001',1=>'小米手机',2=>'3000元',3=>'有货'];$goods=['1001','小米手机','3000元','有货'];//数组默认从0开始编号,递增为1$goods=[5=>'1001',1=>'小米手机',8=>'3000元',9=>'有货'];$goods=[6=>'1001','小米手机','3000元',3=>'有货'];//键值分别为6、7、8、3printf('<pre>%s</pre>',print_r($goods,true));echo $goods[6],'<br>';//调取键值对应的值:6=>1001echo $goods[3],'<hr>';//追加式创建索引数组,使用默认的键名:默认从0开始,逐渐递增1$goods=[];$goods[]='1002';$goods[]='小米电脑';$goods[]='5000元';$goods[]='有货';printf('<pre>%s</pre>',print_r($goods,true));echo '<hr>';//2、关联数组:带有指定键的数组$goods=['id'=>'1001','name'=>'小米手机','price'=>'3000元','is'=>'有货'];printf('<pre>%s</pre>',print_r($goods,true));echo $goods['name'],',',$goods['price'],'<hr>';//追加式创建关联数组,使用语义化的字符串键名$goods=[];$goods['id']='1002';$goods['name']='小米电脑';$goods['price']='5000元';$goods['is']='有货';printf('<pre>%s</pre>',print_r($goods,true));echo '<hr>';//3、多维数组:包含一个或多个数组的数组//多维数组常用的是二维数组;=> 胖箭头, -> 小箭头$goods=[['id'=>'1001','name'=>'小米手机','price'=>'3000元','is'=>'有货'],['id'=>'1002','name'=>'华为手机','price'=>'4500元','is'=>'有货'],['id'=>'1003','name'=>'苹果手机','price'=>'6000元','is'=>'无货'],];printf('<pre>%s</pre>',print_r($goods,true));//多维数组调取数据,苹果手机对应一维中的键名为2,对应二维中的键名为nameecho $goods[2]['name'],'<br>';echo '类别:'.$goods[0]['name'].',价格:'.$goods[0]['price'],'<br>';echo '类别:'.$goods[1]['name'].',价格:'.$goods[1]['price'],'<hr>';


数组的遍历
//数组遍历:逐个遍历、while遍历、for循环遍历、foreach遍历//定义数组$goods=['id'=>'1001','name'=>'小米手机','price'=>'3000元','is'=>'有货'];//1、逐个遍历:输出当前指针指向的数组元素的键名和值//current():值;key():键名printf('[\'%s\']=>%s<br>',key($goods),current($goods));//next() 函数将内部指针指向数组中的下一个元素,并输出next($goods);printf('[\'%s\']=>%s<br>',key($goods),current($goods));// prev() - 将内部指针指向数组中的上一个元素,并输出prev($goods);printf('[\'%s\']=>%s<br>',key($goods),current($goods));// end() - 将内部指针指向数组中的最后一个元素,并输出end($goods);printf('[\'%s\']=>%s<br>',key($goods),current($goods));//current() - 返回数组中的当前元素的值current($goods);printf('[\'%s\']=>%s<br>',key($goods),current($goods));// reset() - 复位,将内部指针指向数组中的第一个元素,并输出reset($goods);printf('[\'%s\']=>%s<br>',key($goods),current($goods));echo '<hr>';//2、while(条件):只要指定的条件成立,则循环执行代码块while(true){printf('[\'%s\']=>%s<br>',key($goods),current($goods));if(next($goods)) continue;else break;}echo '<hr>';//3、for循环遍历:for(初始值;条件;增量){要执行的代码;}//for循环只能用于遍历纯索引数组echo count($goods).'<br>';//count():数组中元素的数目reset($goods);for($i=0;$i<count($goods);$i++){printf('[\'%s\']=>%s<br>',key($goods),current($goods));next($goods);}echo '<hr>';//for遍历中的复位数组指针和数组下移指针操作必须手动填写,foreach()遍历方法可以省略此步骤//4、foreach循环遍历;foreach($array as $value){要执行的代码;};每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值//foreach可以遍历任何类型的数组;$array表示要循环的数组foreach($goods as $value){//只显示键名对应的值echo $value.'<br>';}echo '<hr>';foreach($goods as $key=>$value){//可以显示键名和对应的值printf('[\'%s\']=>%s<br>',$key,$value);}echo '<hr>';//list()用于在一次操作中给一组变量赋值;只用于数字索引的数组list($a,$b)=['admin',20];echo $a.',年龄:'.$b.'<br>';//当list()用于关联数组时,必须填写键名list('name'=>$a,'age'=>$b,'sex'=>$c)=['name'=>'a1','age'=>25,'sex'=>'女'];echo '姓名:'.$a.',年龄:'.$b.',性别:'.$c.'<hr>';$user=[['name'=>'a5','age'=>23,'sex'=>'女'],['name'=>'a2','age'=>30,'sex'=>'男'],['name'=>'a3','age'=>40,'sex'=>'女'],];foreach($user as list('name'=>$a,'age'=>$b,'sex'=>$c)){printf('name=%s,age=%d,sex=%s<br>',$a,$b,$c);}echo '<hr>';//foreach()既可以遍历数组,也可以遍历对象$obj = new stdClass;$obj->name = 'admin';$obj->email = 'admin@php.cn';$obj->role = 1;var_dump($obj);echo '<hr>';foreach ($obj as $p => $v) {echo "$p => $v <br>";}

数组函数
//数组函数//1、键名函数$goods=['id'=>'1001','name'=>'小米手机','price'=>'3000元','is'=>'有货'];echo key($goods).'<br>';//获取键名;返回数组内部指针当前指向元素的键名next($goods);echo key($goods).'<hr>';//想要将数组内的所有键名打印出来$keys=[];while($key=key($goods)){$keys[]=$key;next($goods);}print_r($keys);echo '<hr>';reset($goods);//复位//取到所有的键名,还可以自定义函数获取function array_keys_1($goods){$keys=[];while($key=key($goods)){$keys[]=$key;next($goods);}return $keys;}// array_keys($arr): 直接返回键名组成的数组;print_r(array_keys_1($goods));//获取到所有的键名并组成新的数组echo '<br>';//array_key_exists() 判断数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false//array_key_exists(key,array):key必需。规定键名;array必需。规定数组echo array_key_exists('name',$goods)?'存在':'不存在';echo '<br>';echo array_key_exists('hello',$goods)?'存在':'不存在';echo '<br>';//PHP 7 >= 7.3echo array_key_first($goods);echo '<br>';echo array_key_last($goods);echo '<hr>';// 2、和值相关的函数$arr = [3 => 10, 9 => 20, 0 => 'html', 'id' => 'css', 20 => 20, 30];printf('<pre>%s</pre>',print_r($arr,true));//只获取值$values=[];foreach($arr as $value){$values[]=$value;}printf('<pre>%s</pre>',print_r($values,true));//array_values():返回数组中所有的值(不保留键名)print_r(array_values($arr));echo '<hr>';//in_array() 函数搜索数组中是否存在指定的值$a=['ab','html','css','php'];echo in_array('ab',$a) ?'找到':'未找到';echo '<br>';echo in_array('ho',$a)?'找到':'未找到';echo '<hr>';// array_search() 函数在数组中搜索某个键值,并返回对应的键名// array_search(value,array,strict):value必需。规定在数组中搜索的值;array必需。规定被搜索的数组;// strict可选。如果该参数被设置为 TRUE,则函数在数组中搜索数据类型和值都一致的元素;数字 5 和字符串 5 是不同的。false - 默认$b=["a"=>"5","b"=>5,"c"=>"45"];echo array_search('css',$a,true);//找到css这个值对应的键名2echo '<br>';echo array_search('5',$b);//如果在数组中找到键值超过一次,则返回第一次找到的键值所匹配的键名echo '<hr>';//array_unique()去重print_r(array_unique($arr));//去掉重复的值20$c=["a"=>"red","b"=>"green","c"=>"red"];echo '<br>';print_r(array_unique($c));echo '<hr>';//array_sum() 函数返回数组中所有值的和$arr = [10,20,30,55,99];echo array_sum($arr);echo '<hr>';//3、增加或删除数组中的元素// 栈与队列。 栈: 是仅允许在一端进行增删的数组,先进的后出$stack=[];// 1)在尾部进行增加删除//array_push() 函数向数组尾部插入一个或多个元素array_push($stack, 10);array_push($stack, 20);array_push($stack, 30, 40);//array_pop() 函数删除数组中的最后一个元素// 在尾部出栈, 每次只允许出来一个echo array_pop($stack);printf('<pre>%s</pre>',print_r($stack,true));echo '<hr>';// 2)在头部进行增加删除$arr=[];//array_unshift() 函数用于向数组插入新元素。新数组的值将被插入到数组的开头;最后进入的元素排在最前面array_unshift($arr, 'html', 'css', 'js');array_unshift($arr, 'abc', 'ef');//array_shift() 函数用于删除数组中的第一个元素,并返回被删除的元素echo array_shift($arr);printf('<pre>%s</pre>',print_r($arr,true));echo '<hr>';//队列: 允许在两头进行增删,先进的先出$queue = [];// 尾部进队 + 头部出队:array_push()+array_shift()array_push($queue, 10,20,30);echo array_shift($queue);printf('<pre>%s</pre>',print_r($queue,true));echo '<hr>';// 头部进队 + 尾部出队:array_unshift()+array_pop()$ef=[];array_unshift($ef, 10,20,33);echo array_pop($ef);printf('<pre>%s</pre>',print_r($ef,true));echo '<hr>';//4、数组的排序//1)sort() - 对数组进行升序排列;字母始终在数字前面,然后再按照字母升序排序$item = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];printf('<pre>%s</pre>',print_r($item,true));sort($item);//函数的操作会影响原始的数组,原始数组中0=>30,sort()操作后0=>abcprintf('<pre>%s</pre>',print_r($item,true));//2)rsort() - 对数组进行降序排列rsort($item);printf('<pre>%s</pre>',print_r($item,true));echo '<hr>';//3)-6)的函数的键值对应关系均会保留// 3)asort() - 根据数组的值,对数组进行升序排列$a=['e' => 10, 'a' => 3, 'p' => 5,'b'=>66];printf('<pre>%s</pre>',print_r($a,true));asort($a);printf('<pre>%s</pre>',print_r($a,true));//4)arsort() - 根据数组的值,对数组进行降序排列arsort($a);printf('<pre>%s</pre>',print_r($a,true));//5)ksort() - 根据数组的键,对数组进行升序排列ksort($a);printf('<pre>%s</pre>',print_r($a,true));//6)krsort() - 根据数组的键,对数组进行降序排列krsort($a);printf('<pre>%s</pre>',print_r($a,true));echo '<hr>';// 7)usort() 使用用户自定义的比较函数对数组进行排序$arr=[4,2,8,6];usort($arr,function($a,$b){// return $a-$b;//由小到大进行排序return $b-$a;//由大到小进行排序});printf('<pre>%s</pre>',print_r($arr,true));//8)natsort() 函数用"自然排序"算法对数组进行排序。保留它们原始的键值对应关系$arr = ['img1.jpg', 'img5.jpg', 'img10.jpg', 'img8.jpg'];printf('<pre>%s</pre>',print_r($arr,true));natsort($arr);printf('<pre>%s</pre>',print_r($arr,true));echo '<hr>';//5、array_slice(): 从数组中取出一部分元素//array_slice(array,start,length,preserve):array必需。要进行操作的数组;// start必需。数值。规定取出元素的开始位置。 0 = 第一个元素。 如果该值设置为正数,则从前往后开始取。如果该值设置为负数,则从后向前取,-2表示从数组的倒数第二个元素开始;// length可选。规定被返回数组的长度;默认从开始位置到结尾;果该值设置为负数,则函数将在距离数组末端这么远的地方终止取出//preserve可选。规定函数是保留键名还是重置键名;true - 保留键名;false - 默认。重置键名$arr=['red','green','blue','yellow','brown'];printf('<pre>%s</pre>',print_r($arr,true));$item=array_slice($arr,1);//从数组的第2个键开始调取printf('<pre>%s</pre>',print_r($item,true));$item=array_slice($arr,-1);//从数组的倒数第1个键开始调取printf('<pre>%s</pre>',print_r($item,true));$item=array_slice($arr,1,-1);//在距离结尾1个元素的时候终止获取printf('<pre>%s</pre>',print_r($item,true));$item=array_slice($arr,1,2,true);//获取的时候保留原始键值对应关系printf('<pre>%s</pre>',print_r($item,true));echo '<hr>';//6、array_splice() 函数从数组中删除选定的元素,并用新元素取代它。函数也将返回被移除元素的数组//array_splice(array,start,length,arrays):array必需。规定数组;start必需。规定删除元素的开始位置。 0 = 第一个元素。如果该值设置为负数,则从数组末端倒数该值指定的偏移量开始删除。 -2 表示从数组的倒数第二个元素开始// length可选。规定被删除的元素个数;如果该值设置为负数,则删除从 start 到数组末端倒数 length 为止中间所有的元素。如果该值未设置,则删除从 start 参数设置的位置开始直到数组末端的所有元素// arrays可选。规定带有要插入原始数组中元素的数组$arr = [10, 28, 9, 33, 56, 21, 82, 47];printf('<pre>%s</pre>',print_r($arr,true));// $res = array_splice($arr, 1, 3);//从数组的第2个键开始删除,共删除3个// // 返回值就是被删除的元素组成的数组// printf('<pre>%s</pre>',print_r($res,true));// $res = array_splice($arr, -4, 3);//从数组的倒数第4个元素开始删除,共删除3个// printf('<pre>%s</pre>',print_r($res,true));$res = array_splice($arr, 1,-3);//从数组的第2个元素到倒数第3个元素之间的所有元素printf('<pre>%s</pre>',print_r($res,true));echo '<hr>';//替换、增加$arr=[4,2,8,6,20,40];printf('<pre>%s</pre>',print_r($arr,true));$res=array_splice($arr,1,2,[22,33]);//将数据第2个到第3个之间的元素替换成22,33printf('<pre>%s</pre>',print_r($arr,true));$res=array_splice($arr,1,0,[12,53]);//将[12,53]增加到原始数组中的第2个元素位置后面printf('<pre>%s</pre>',print_r($arr,true));echo '<hr>';//7、array_filter(): 过滤数组中的元素,只返回计算结果为"true"的元素组成的数组// 以下六种类型的数据会自动转为falsevar_dump(boolval([]));var_dump(boolval(null));var_dump(boolval(0));var_dump(boolval('0'));var_dump(boolval(''));var_dump(false);//php 里的标量就是 int , string , bool , float 这几种类型$a1=['a','b',2,3,4,(new class {}),[23,44],[],null,0];$a2=array_filter($a1,function ($item){return $item;//return boolval($item)的简写});printf('<pre>%s</pre>',print_r($a1,true));printf('<pre>%s</pre>',print_r($a2,true));// 如果只是简单的过滤掉false值,可以不写回调函数,简写成$a2 = array_filter($a1);// 如果对返回的为true的元素,进行再次的处理, 就必须要写回调参数$a2 = array_filter($a1,function($item){// return is_scalar($item) && $item;// 只返回标量: 字符串, 数值, 布尔,浮点类型return is_object($item);// 只返回对象// return is_array($item) && $item;// 只返回数组});printf('<pre>%s</pre>',print_r($a2,true));echo '<hr>';//8、array_map()为数组中的每一个元素应用回调函数进行处理,并返回一个新数组$arr = ['php',[3,4,5], (new class {public $name='电脑';public $price=8888;}), 15, 20];printf('<pre>%s</pre>',print_r($arr,true));// 1)如果元素是对象: 就输出它的属性// 2)如果元素是数组,就转为字符串输出// 3)其它元素,直接输出$res=array_map(function($item){switch(gettype($item)) {//gettype() 获取变量的类型case 'object':$item = implode(',', get_object_vars($item));//get_object_vars()返回由对象属性组成的关联数组break;case 'array':$item = implode(',', $item);//implode() 把数组元素组合成一个字符串break;}return $item;}, $arr);printf('<pre>%s</pre>',print_r($res,true));echo '<hr>';//9、array_reduce(): 元素迭代处理形成单一的返回值;发送数组中的值到用户自定义函数,并返回一个字符串//array_reduce(array,function,initial):array必需。规定数组;function必需。规定函数的名称;initial可选。规定发送到函数处理的第一个值$arr = [1,2,3,4,5];$res = array_reduce($arr, function($prev, $next){//求和,当前的运算结果,实际上通过$prev返回return $prev += $next;});print_r($res);echo '<br>';function my($v1,$v2){return $v1 . "-" . $v2;};$a=array("Dog","Cat","Horse");print_r(array_reduce($a,"my",5));echo '<br>';$arr = [1,2,3,4,5];$res = array_reduce($arr, function($prev, $next){//求和,当前的运算结果,实际上通过$prev返回return $prev += $next;},7);//7+1+2+3+4+5print_r($res);echo '<hr>';//10、implode() 把数组元素组合成一个字符串//implode(separator,array):separator可选。规定数组元素之间放置的内容,默认是 ""(空字符串);array必需。要组合为字符串的数组$arr = [1,2,3,4,5];$res=implode('-',$arr);printf('<pre>%s</pre>',print_r($res,true));//explode() 分割字符串;使用一个字符串分割另一个字符串,并返回由字符串组成的数组$str = "www.php.com";$abc=explode('.',$str);//在.处进行分割printf('<pre>%s</pre>',print_r($abc,true));echo '<hr>';//11、extract()将关联数组的键值对转为一个个独立的变量, 变量名就是原来的键名//extract(array,extract_rules,prefix):array必需。规定要使用的数组// extract_rules可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突;prefix可选$config = ['type' => 'mysql','host' => 'localhost','dbname' => 'php','charset' => 'utf8'];extract($config);echo $type.',', $host.',', $dbname.',', $charset;echo '<hr>';








Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号