数组
1.数字索引数组:array('a','b','c');
2.访问数组内容 $arr[下标]
3.新增数组元素 $arr[下标]=内容
4.使用循环访问数组
//针对数字索引 $arr=array("a","b","c"); for ($i=0;$i<count($arr);$i++){ echo $arr[$i]; } //数字索引和字符串索引 $arrStr=array("arr1"=>"value1","hello"); foreach ($arrStr as $arr){ echo $arr; }
5.关联数组:$arrStr=array("arr1"=>"value1","hello");
6.遍历数组
//---------------针对数字索引----------------- $arr=array("a","b","c"); for ($i=0;$i<count($arr);$i++){ echo $arr[$i]; } //---------------针对数字索引和字符串索引----------------- $arrStr=array("arr1"=>"value1","hello"); foreach ($arrStr as $key=> $arr){ echo $key."---".$arr; } /** * each:按顺序返回数组中的每个元素 * $arr是一个数组,调用each的时候会返回4个参数 0、1、key、value */ while($arr=each($arrStr)){ //已弃用 echo $arr[0]; echo $arr[1]; } /* * list()可以用来将一个数组分解成一系列的值 * reset将数组的内部指针重置到数组中的第一个元素 */ reset($arrStr); while(list($k,$v)=each($arrStr)){ echo $k.$v; }
7.排序
- sort:按照字母或者数字排序(key 升序)ps:key值会变成数字索引
- asort:根据value值排序(value 升序)
- ksort:根据key值排序(key 升序)
- rsort:(key 降序)ps:key值会变成数字索引
- arsort:(value 降序)
- krsort:(key 降序)
- usort:使用用户自定义的函数对数组进行排序
$products=array(array('tir','aires',100), array('oil','oil',10), array('spk','spark plugs',4)); function compare($x,$y){ if ($x[1]==$y[1]){ return 0; }elseif ($x[1]<$y[1]){ return -1; }else{ return 1; } } usort($products,'compare'); var_dump($products);
- shuffle():随机排序
- array_reverse():给出一个原来数组的反向排序
反向排序自实现:
$numbers=array(); for ($i=count($products);$i>0;$i--){ array_push($numbers,$products[$i-1]); } var_dump($numbers);
8.从文件载入数组
/** * file:将文件内容写进数组中,以行分割 * count:统计数组中有多少个元素 * explode:将传入的字符串分割成小块 */ $root=$_SERVER['DOCUMENT_ROOT']; $orders=file("$root/test.txt"); $number=count($orders); if ($number==0){ echo "no orders pending"; } for ($i=0;$i<$number;$i++){ $line=explode(" ",$orders[$i]); echo $line[0]."<br/>"; var_dump($line); }
9.其他数组函数
/** * 将数组反向显示 *current:返回第一个元素 *next、each:返回当前元素 * end:指针移到最后一个元素 * reset:指针移到第一个元素 * prev:与next相反,将指针往回移一个位置在返回新的当前元素 */ $a=array(2,333,22,22,34); $value=end($a); while($value){ echo $value."<br/>"; $value=prev($a); }
count、sizeof:统计数组个数
array_count_values:统计数组中的value值出现了多少次
extract:通过一个数组创建一系列的标量常量 ps:该元素关键字必须是一个有效的变量名,如果以数字或包含空格的关键字将会被跳过
$array=array('key1'=>'value1','key2'=>'value2'); extract($array); echo $key1;
ex1需求:将一个二维数组内的值转置
<?php $arr=array( array("name"=>"huahua","age"=>"15"), array("name"=>"caicai","age"=>"18") ); echo "排序前<br/>"; //转置思路: //1.循环外层的数组,确定里面数组的值 //2.循环里层,将他的下标置换,并打印出来 for ($i=0; $i <count($arr) ; $i++) { foreach ($arr[$i] as $key => $value) { echo $arr[$i][$key]." "; } echo "<br/>"; } var_dump($arr); echo "排序后<br/>"; // 思路: // 1.先新建一个数组 // 2.在循环将下标值替换掉,将替换后的值新增到新数组 // 3.遍历新数组,将值打印出来 // echo count($arr); // 新建数组,在多维数组下的key值取出,作为新数组的key foreach ($arr[0] as $key => $value) { $arr1[$key]=array(); } // var_dump($arr1); // 循环老数组,将置换value值赋给新数组 for ($i=0; $i <count($arr) ; $i++) { foreach ($arr[$i] as $key => $value) { $arr1[$key][$i]=$arr[$i][$key]; //往老数组新增值 } echo "<br/>"; } var_dump($arr1); //遍历老数组,将key和value值打印出来 foreach ($arr1 as $a=>$b) { foreach ($b as $key => $value) { echo $arr1[$a][$key]." "; } echo "<br/>"; } ?>
结果:
ex2:找出一组数组中最大值、最大值的角标、最小值、最小值的角标及平均数
需求:现有一组评委打分的数据。
- 求出他们的最大值与最小值。
- 最大值最小值的角标
- 去除最大值与最小值后的平均数
- 找出最佳评委与最差评委
代码:
2 <?php 3 $arr=array(1,2,3,4); 4 //最小值 5 //思路:44,5,3,333,445,99,54,332,-6 6 // 1.定义变量,一个记录下标$index,一个记录最小值$minvalue 7 // 2.假如最小值为下标为0的数 8 // 3.拿认为最小的值与该数组内的数比较 9 // 4.如果$minvalue大于数组内的某个数,则说明这个数不是最小值。交换下标与最小值 10 function minfunction($arr){ 11 $index=0; 12 $minvalue=$arr[0]; 13 for ($i=1; $i <count($arr) ; $i++) { 14 if ($minvalue>$arr[$i]) { 15 $index=$i; 16 $minvalue=$arr[$i]; 17 } 18 } 19 return $index; 20 } 21 $a=minfunction($arr); 22 // echo $a; 23 echo "最小值为$a,他的分数为$arr[$a]"; 24 echo "<br/>"; 25 //最大值 26 // 思路:与最小值思路一样 27 function maxfunction($arr){ 28 $index=0; 29 $minvalue=$arr[0]; 30 for ($i=1; $i <count($arr) ; $i++) { 31 if ($minvalue<$arr[$i]) { 32 $index=$i; 33 $minvalue=$arr[$i]; 34 } 35 } 36 return $index; 37 } 38 $b=maxfunction($arr); 39 // echo $a; 40 echo "最大值为$b,他的分数为$arr[$b]"; 41 echo "<br/>"; 42 // 平均数 43 // 思路: 44 //定义一个变量记录总分数 45 // 2.将除最大值与最小值以外的值相加 46 // 3.除以count($arr)-2就得到平均值了 47 $sum=0; 48 for ($i=0; $i <count($arr) ; $i++) { 49 // echo $a."===".$b."---".$i."<br/>"; 50 // $c=($i!=$a) && ($i!=$b); 51 // var_dump($c); 52 //注意:以下条件&&的意思两者都为真,才执行如下语句 53 if (($arr[$i]!=$arr[$a]) && ($arr[$i]!=$arr[$b])) { 54 $sum+=$arr[$i]; 55 // echo $sum."<br/>"; 56 } 57 } 58 echo "除去最大值与最小值的总分为$sum"."<br/>"; 59 echo "平均数为".$sum/(count($arr)-2); 60 echo "<br/>"; 61 //找出最佳评委与最差评委 62 // 思路: 63 // 1.先找出平均数 64 // 2.定义一个变量为最佳评委,互相去比较 65 // 3.遍历老数组,比较平均数与哪个值相差的最少,就是最佳评委 66 $avg=$sum/(count($arr)-2); 67 echo "$avg<br/>"; 68 $goodindex=0; 69 $goodgrades=abs($arr[0]-$avg); 70 for ($i=1; $i <count($arr) ; $i++) { 71 if ($goodgrades>abs($avg-$arr[$i])) { 72 $goodperson=$i; 73 // echo $goodperson."<br/>"; 74 $goodgrades=abs($avg-$arr[$i]); 75 } 76 77 } 78 echo "最佳评委的分数为$arr[$goodperson]"; 79 ?
结果:
在做题过程中遇到的错点:
- 第52行值的比较,写成了($arr[$i]!=$arr[$a]) && ($arr[$i]!=$arr[$b]),当然这样执行结果也是对的。对下标进行比较更方便快捷
- 第52行运算符,写成了||。之后一直在纠结怎么4个数他都算进去了。= =(沉默一阵)。原来是运算符用错了。必须两个都为真,才叠加sum的值
总结:
- 求最大值与最小值,使用循环遍历排序(排序方法:冒泡排序、选择排序、快递排序)
- 运算符:&&、and(都为true) 、or ||(任一为true) 。详情参照http://www.cnblogs.com/8013-cmf/p/7722966.html
需求3:定义个数组,用户输入不同的10个成绩,数组代表学生学号
- 输入学号,打印该学生成绩
- 输入成绩,打印fai学生学号
- 统计各个分数阶段下的学生人数
- 输入学号,删除该学生的成绩
代码:view.php
1 <!-- 前端思路: --> 2 <!-- 1.写多个form表单,因为每次查询的条件不同 --> 3 <!-- 2.在每个表单内,需写一个隐藏表单,便于接收页面判断是要调用哪个功能 --> 4 <html> 5 <head></head> 6 <body> 7 <h1>学生成绩管理系统</h1> 8 <!-- 该表单定义查询成绩的学号 --> 9 <form action="homework.php" method="post"> 10 <p>请输入10个学生成绩<input type="text" name="grades"></p><br/> 11 请输入学生学号<input type="text" name="xuehao"> 12 <!-- 隐藏表单 --> 13 <input type="hidden" name="doing" value="xh"> 14 <input type="submit" value ="查询学号的成绩"> 15 </form> 16 <!-- 该表单定义查询成绩的学号 --> 17 <form action="homework.php" method="post"> 18 请输入成绩<input type="text" name="chengji"> 19 <!-- 隐藏表单 --> 20 <input type="hidden" name="doing" value="cj"> 21 <input type="submit" value="查询成绩的学号" > 22 </form> 23 <!-- 该表单用于查询分类成绩(不及格,良好,优秀)有多少个学生 --> 24 <form action="homework.php" method="post"> 25 <input type="hidden" name="doing" value="fl"> 26 <input type="submit" value="查询成绩分类的整体情况" > 27 </form> 28 <!-- 输入学号,将删除该学生的成绩 --> 29 <form action="homework.php" method="post"> 30 请输入学号<input type="text" name="shanchu"> 31 <!-- 隐藏表单 --> 32 <input type="hidden" name="doing" value="sc"> 33 <input type="submit" value="删除该学号的成绩" > 34 </form> 35 </body> 36 </html>
homework.php
1 <?php 2 // 思路: 3 // 1.先接收隐藏表单所传过来的值 4 // 2.判断是要调去哪一个功能 5 $arr=array(22,45,99,54,2,88); 6 function findgrade($arr,$stuxuehao){ 7 return $arr[$stuxuehao]; 8 } 9 $doing=$_REQUEST["doing"]; 10 if ($doing=='xh') { 11 $stuxuehao=$_REQUEST["xuehao"]; 12 echo "学号为".$stuxuehao."的成绩为".findgrade($arr,$stuxuehao); 13 }elseif ($doing=='cj') { 14 $stuchengji=$_REQUEST["chengji"]; 15 // 1.用成绩与数组中的数值比较,相等的那个数的下标就是成绩的学号了 16 //2.定义一个变量,标记是否有在数组中查找到该成绩 17 //3.如果该标记值没有被改变,则输入“您查询的成绩没有学号” 18 $flag=false; 19 for ($i=0; $i <count($arr) ; $i++) { 20 if ($stuchengji==$arr[$i]) { 21 echo "您查询的该成绩的学号为".$i; 22 $flag=true; 23 } 24 } 25 if (!$flag) { 26 echo "您查询的成绩没有学号"; 27 } 28 }elseif ($doing=="fl") { 29 // 思路: 30 // 1.将成绩的分类定义为一个数组(59分以下不及格,60-69分及格,70-85分良好,86-100分优秀) 31 // 2.遍历老数组的值,将该值与分类成绩做比较 32 // 3.属于哪个分类,哪个分类的value值就+1 33 $arr1=array(0,0,0,0); 34 for ($i=0; $i <count($arr) ; $i++) { 35 if ($arr[$i]>=0 && $arr[$i]<=59) { 36 $arr1[0]+=1; 37 }elseif ($arr[$i]>=60 && $arr[$i]<=69) { 38 $arr1[1]+=1; 39 }elseif ($arr[$i]>=70 && $arr[$i]<=85) { 40 $arr1[2]+=1; 41 }else{ 42 $arr1[3]+=1; 43 } 44 } 45 echo "不及格的人数有".$arr1[0]."<br/>"; 46 echo "及格的人数有".$arr1[1]."<br/>"; 47 echo "良好的人数有".$arr1[2]."<br/>"; 48 echo "优秀的人数有".$arr1[3]."<br/>"; 49 }elseif ($doing=="sc") { 50 // 思路: 51 // 1.接收需删除的学号值 52 // 2.删除数组中对应学号值的成绩 53 $stushanchu=$_REQUEST["shanchu"]; 54 unset($arr[$stushanchu]); 55 var_dump($arr); 56 } 57 ?>
结果:
练习过程中遇到的难点:
- view.php中的13行隐藏表单,纠结了很久到底是怎么传值给别的页面做判断
- view.php中多个form
- homework.php中的接收参数。
总结:
- hidden表单传值通过name来识别,但判断的值为value值。比如$doing=$_REQUEST["doing"]; if ($doing=='xh')
- 多个form是为了判断点击事件
- 接收值$_REQUEST["doing"],是使用的[]中括号,而不是()
ex4:以objid以日期为间隔,使用json格式打印出来
=》(变成)
方法一:
1 <?php 2 $arr = array( 3 0=>array("dataname"=>"2017-08-08","objID"=>"11"), 4 1=>array("dataname"=>"2017-08-08","objID"=>"12"), 5 2=>array("dataname"=>"2017-08-08","objID"=>"13"), 6 3=>array("dataname"=>"2017-08-09","objID"=>"14"), 7 4=>array("dataname"=>"2017-08-09","objID"=>"15"), 8 5=>array("dataname"=>"2017-08-09","objID"=>"16"), 9 6=>array("dataname"=>"2017-08-10","objID"=>"17"), 10 7=>array("dataname"=>"2017-08-10","objID"=>"18"), 11 8=>array("dataname"=>"2017-08-10","objID"=>"19"), 12 9=>array("dataname"=>"2017-08-11","objID"=>"20"), 13 10=>array("dataname"=>"2017-08-11","objID"=>"21"), 14 11=>array("dataname"=>"2017-08-11","objID"=>"22") 15 ); 16 //思路 17 //1.新建一个空数组 18 //2.便利老数组 19 //3.判断老数组的dataname值在新数组是否存在 20 //如果不存在则在新数组新建dataname及objid值。 21 //如果存在则去判断对应的objid值在新数组,记录最后一次出现的位置,如果为false,则往对应的dataname下添加objid值 22 $arr1=[]; 23 foreach ($arr as $k => $v) { 24 if (array_key_exists($v["dataname"],$arr1)) { 25 //strpos:查找“$v['objID']”在“$arr1[$v['dataname']]['objID']”中最后一次出现的位置 26 $res=strpos($arr1[$v['dataname']]['objID'],$v['objID']); 27 if ($res===false) { 28 $arr1[$v['dataname']]['objID'].=",".$v['objID']; 29 } 30 }else{ 31 $arr1[$v['dataname']]['objID']=$arr[$k]['objID']; 32 } 33 } 34 var_dump($arr1); 35 ?>
结果:
方法二:
1 <?php 2 $arr = array( 3 0=>array("dataname"=>"2017-08-08","objID"=>"11"), 4 1=>array("dataname"=>"2017-08-08","objID"=>"12"), 5 2=>array("dataname"=>"2017-08-08","objID"=>"13"), 6 3=>array("dataname"=>"2017-08-09","objID"=>"14"), 7 4=>array("dataname"=>"2017-08-09","objID"=>"15"), 8 5=>array("dataname"=>"2017-08-09","objID"=>"16"), 9 6=>array("dataname"=>"2017-08-10","objID"=>"17"), 10 7=>array("dataname"=>"2017-08-10","objID"=>"18"), 11 8=>array("dataname"=>"2017-08-10","objID"=>"19"), 12 9=>array("dataname"=>"2017-08-11","objID"=>"20"), 13 10=>array("dataname"=>"2017-08-11","objID"=>"21"), 14 11=>array("dataname"=>"2017-08-11","objID"=>"22") 15 ); 16 // 思路: 17 // 1.先新建2个空数组 18 // 2.先判断老数组的$i是否等于1 19 // 等于1,在数组1添加该objid值。且数组2[‘dataname’]等于数组1 20 // 不等于1,则判断老数组的$i-1行的dataname值是否与$i值相等 21 // 如果相等,则在对应的dataname下添加对应的objid值 22 // 如果不相等,则代表在该dataname下,无objid(新建objid值) 23 $temp=array(); 24 for ($i=0; $i <count($arr) ; $i++) { 25 $dataname=$arr[$i]['dataname']; 26 $objID=$arr[$i]['objID']; 27 if ($i==0) 28 { 29 $temp['objID']=$objID; 30 }else 31 { 32 $lastDataname=$arr[$i-1]['dataname']; 33 if ($dataname==$lastDataname) 34 { 35 $temp['objID']=$temp['objID'].",".$objID; 36 }else{ 37 $temp['objID']=$objID; 38 } 39 } 40 $arr2[$dataname]=$temp; 41 } 42 var_dump($arr2); 43 ?>
结果:
方法三:
<?php $arr = array( 0=>array("dataname"=>"2017-08-08","objID"=>"11"), 1=>array("dataname"=>"2017-08-08","objID"=>"12"), 2=>array("dataname"=>"2017-08-08","objID"=>"13"), 3=>array("dataname"=>"2017-08-09","objID"=>"14"), 4=>array("dataname"=>"2017-08-09","objID"=>"15"), 5=>array("dataname"=>"2017-08-09","objID"=>"16"), 6=>array("dataname"=>"2017-08-10","objID"=>"17"), 7=>array("dataname"=>"2017-08-10","objID"=>"18"), 8=>array("dataname"=>"2017-08-10","objID"=>"19"), 9=>array("dataname"=>"2017-08-11","objID"=>"20"), 10=>array("dataname"=>"2017-08-11","objID"=>"21"), 11=>array("dataname"=>"2017-08-11","objID"=>"22") ); $data=array(); foreach($arr as $k=>$v){ if (array_key_exists($v["dataname"],$data)){ $data[$v["dataname"]]["objID"]=$data[$v["dataname"]]["objID"].",".$v["objID"]; }else{ $data[$v["dataname"]]["objID"]=$v["objID"]; } } var_dump($data);