【三】php 数组
数组
//针对数字索引
$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;
}
//---------------针对数字索引-----------------
$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;
}
- 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);
/**
* 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);
}
/**
* 将数组反向显示
*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);
}
$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);
【三】php 数组的更多相关文章
- javascript第三弹——数组
什么是数组 数组是值的有序集合.每个值叫做元素,每个元素在数组中都有数字位置编号,也就是索引.JS中的数组是弱类型的,数组中可以含有不同类型的元素.数组元素甚至可以是对象或其它数组.数组的长度是动态的 ...
- JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想
JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好 ...
- JavaScript数组(三)数组对象使用整理
一.数组声明方法1. var a=new Array();2. var a=new Array([size]);3.var a=new Array(['a'],[1],['b'],[123]);4. ...
- 三个数组求中位数,以及中位数的中位数----java算法实现
求三个数组的中位数,以及中位数的中位数. import java.util.Arrays; public class median { public static void main(String ...
- 高程(三)----数组Array
一.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上 ...
- PHP&MySQL(三)——数组
前一段忙着比赛忙着找实习,最后一地鸡毛,就是长长教训罢了.... 看书还是多必须的,试着高效的.踏实的做吧!! <?php //PHP数组其实能创建很多种数据结构,列表,堆栈,队列,树等 //数 ...
- ES6(三)数组的扩展
1.Array.form ES6中,Array.from = function(items,mapfn,thisArg) { } Array.from 用于将 类数组 和 可遍历对象(实现了It ...
- JavaScript -基础- 函数与对象(三)数组对象
一.数组对象 1.创建方式 1)创建方式一 var arr=[1,2,3]; 2)创建方式二 var arr2=new Array(1,2,3); 注意: 数组中可以存储任何数据类型.方法类型(Jav ...
- JQuery攻略(三)数组与字符串
在上两章,JQuery攻略(一) 基础知识——选择器 与 DOM 和 JQuery攻略(二) Jquery手册 我们为后面的章节打好了基础,在这一章节中,我们继续. 在这一章节中,我们记录的是JQue ...
- ES6必知必会 (三)—— 数组和对象的拓展
数组的扩展 1.拓展运算符('...'),它相当于rest参数的逆运算,用于将一个数组转换为用逗号分隔的参数序列: console.log(...[1, 2, 3]) // 1 2 3 console ...
随机推荐
- [转载]Request、Request.Form和Request.QueryString的区别
Request.Request.Form和Request.QueryString的区别 request本身是一个系统的静态对象,本身也可以作为数组调用,比如request("abc" ...
- .NET 常用ORM之Gentle.Net
.Net常用的就是微软的EF框架和Nhibernate,这两个框架用的都比较多就不做详细介绍了,今天我们来看看Gentle.Net,Gentle.Net是一个开源的优秀O/R Mapping的对象持久 ...
- Java中在java.sql.Date的系统时间上加上30天并写入oracle
在java.sql.Date的系统时间上加上30天,并写入oracle 思路:通过 Calendar.getInstance() 获得对象,然后 add() 方法添加 时间,再通过 new java. ...
- Wisdom RESTClient支持自动化测试并可以生成API文档
Wisdom REST Client V1.2 支持自动化测试RESTful API并生成精美的测试报告,同时基于历史数据自动生成精美的RESTful API文档. 工具地址:https://gith ...
- 第三节 深入JavaScript
函数的返回值:(把函数体内的数据传出到函数体外) 什么是函数的返回值:函数执行结果.可以没有返回值 一种函数应该只返回一种类型的值 函数传参:(与函数返回值相反,把外面数据传入函数体内) 可变参(不定 ...
- Spring数据库开发
Spring的数据库开发 #Spring中JDBC模板的作用 JDBC模板负责数据库资源管理和错误处理: #熟悉Spring JDBC的配置 配置数据源和jdbc模板 <?xml versio ...
- Python2的一些问题及解决办法
1. 无法注释中文的解决办法 # -*- coding:utf8 -*- # 添加这一行就行了 from django.contrib import admin from myapp.models i ...
- API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd(转)
前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay Çelik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx 作 ...
- VC++ 判断一个文件是不是快捷方式
转载:https://bbs.csdn.net/topics/34999 #include <iostream> #include <Shlobj.h> #include &l ...
- Bootstrap3基础 btn-group-vertical 按钮组(横着、竖着排列)
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...