php : 基础(6)
数组
数组基础
含义:
数组就是一系列数据的集合体,他们按设定的顺序排列为一个“链的形状”。
注意:php中的数组单元的顺序,跟下标无关!
数组定义(赋值):
$arr1 = array(3, 11, 5, 18, 2 );//这是最常见的数组,索引数组,下标为“默认下标”,就是从0开始的整数;
$arr2 = array(“a”=>3, “bb”=>11, “cc123”=>5, ‘d1’=>18, ‘xyz’=>2 ); //关联数组,下标为字符串,常见
$arr3 = array(1=>3, 10=>11, 3=>5, 0=>18, 88=>2 ); //下标可以人为给定;
$arr4 = array(1=>3, ‘a1’=>11, 3=>5, ‘mn’=>18, 88=>2 ); //下标可以数字和字符串混合使用;
$arr5 = array(5=>3, 11, 3=>5, ‘mn’=>18, 2 ); //有指定下标,也有“自动下标”,
//此时下标为:5,6,3,”mn”, 7
//可见,自动下标为“前面最大数字下标+1”
$arr6 = array(5=>3, 7.7=>11, 3=>5, ‘mn’=>18, 2 ); //此时下标为:5,7,3,”mn”, 8
$arr7 = array(5=>3, true=>11, false=>5, ‘mn’=>18, 2 ); //此时下标为:5,1,0,”mn”, 6
$arr8 = array(1=>3, 3=>33, true=>11, ); //此时下标为:1,3,其对应值为:11, 33
//下标如果有重复,后面的值覆盖前面的值;
$arr9 = array(1=>3, -3=>33, 11, ); //此时下标为:1, -3, 2,注意:最后一个逗号“可以有”。
其他一些形式:
$arr10[] = 3;
$arr10[] = 11;
$arr10[] = 5; //该数组下标为0,1,2,常规情况
$arr11[‘a’] = 3;
$arr11[‘bb’] = 11;
$arr11[‘cc123’] = 5; //该数组下标为’a’,’bb’,’cc123’,常规情况
$arr12[1] = 3;
$arr12[] = 11; //此时下标为2
$arr13[‘cc123’] = 5; //该数组下标为1,2,’cc123’
特别注意:php中,数组单元的顺序,是由其“放入”顺序决定,而不是下标。
数组取值:
$v1 = $arr1[0];
$i = 3;
$v2 = $arr1[$i]; //取得数组下标为3的单元的值;
总体上,可以将取得一个数组的单元的值,看组取得一个变量的值完全一样!!!
数组的分类
1.按键值关系来分:
- 索引数组:通常认为,如果一个数组的下标是严格按照从0开始的连续的整数作为下标,则称其为索引数组——就是类似js数组的下标。例如:
$arr1 = array(3, 11, 5, 18, 2 );//这是最常见的数组,下标为“默认下标”,就是从0开始的整数;
- 关联数组:通常认为,如果一个数组的下标都是一个“字符串”并一定程度上表名了该单元的“含义”,则称为关联数组,例如:
$conf = array(
‘host’=>”localhost” ,
‘port’=>3306 ,
‘username’=>’root’ ,
‘password’ => ‘123’ ,
);
- 混合数组:既有数字下标,也有字符下标的情况:
$arr4 = array(1=>3, ‘a1’=>11, 3=>5, ‘mn’=>18, 88=>2 ); //下标可以数字和字符串混合使用;
2.按数组的维数(复杂程度)分:
- 一维数组:
$a = array(1, 11, 111);
$b = array(2, 22, 222);
$c = array(3, 33, 333);
- 二维数组:
$dd = array(
array(1, 11, 111),
array(2, 22, 222),
array(3, 33, 333)
);
- 多维数组:无非就是继续里面再用数组代替。
数组的基本使用
1.求一个一维数组的平均值:

2.求一个二维数组的平均值:

3.求一个一维数组的最大值:

4.求交换一个一维数组的最大值和最小值的位置:


有关数组的交换,再说两句:
$a = array( 3, 11, 5, 7, 20, 18); //下标是0,1,2,3,4,5
需求1:交换数组第0项和第3项:
$v1 = $a[0];
$v2 = $a[3];
$t = $v1;
$v1 = $v2;
$v2 = $t; //这种做法根本不行,因为v1,v2只是2个变量,跟数组没有关系了!
正确的做法是:
$t = $a[0];
$a[0] = $a[3];
$a[3] = $t;
需求2:交换数组首项和末项:
$pos1 = 0; //首项的下标
$pos2 = count($a) - 1; //最后一项的下标
$t = $a[$pos1];
$a[$pos1] = $a[$pos2];
$a[$pos2] = $t;
需求3:交换数组最大项和最小项:
$pos_max = ....; //经过一番计算得到最大项的下标;
$pos_min = ....; //经过一番计算得到最小项的下标
$t = $a[$pos_max];
$a[$pos_max] = $a[$pos_min];
$a[$pos_min] = $t;
数组的遍历
foreach基本语法
foreach( $数组变量名 as 【$key =>】 $value ){
//循环体;这里可以去“使用”$key 和 value;
//$key 和 $value 就是该遍历语句一次次取得的数组的每一个单元(项)的下标和对应值。
//而且,它总是从数组的开头往后按顺序取数据。
}
数组的指针操作及遍历原理:
首先,看看数组的一个“形象图”:
$arr4 = array(1=>3, ‘a1’=>11, 3=>5, ‘mn’=>18, 88=>2 );
可以将其以视觉化的方式理解为:

|
数组下标: |
1 |
“a1” |
3 |
“mn” |
88 |
|
对应数据: |
8 |
11 |
5 |
18 |
2 |
其中,该箭头,就是数组内部的所谓“指针”——注意,不可见,不可输出,只是一种辅助理解的图形!
说明:
- 该箭头,就是数组内部的所谓“指针”
- 默认情况下,该指针指向数组的第一个单元。
- 数组的有关单元的操作,如果没有指定下标,则就是针对该指针指向的单元的操作。
- 所谓遍历,其实就是一次次取得当前单元的键和值,并放入对应的变量$key, $value,然后移动指针到下一个单元。
则,数组,作为一个“总体数据单位”,有如下指针操作函数可以使用:
- $v1 = current($数组); //获得数组的当做指针所在单元的“值”;
- $v2 = key($数组); //获得数组的当做指针所在单元的“键”(下标);
- $v3 = next($数组); //先将数组的指针移向下(后)一个单元,然后取得该新单元的值;
- $v4 = prev($数组); //先将数组的指针移向上(前)一个单元,然后取得该新单元的值;
- $v5 = end($数组); //先将数组的指针直接移向最后一个单元,然后取得该新单元的值;
- $v6 = reset($数组); //先将数组的指针直接移向第一个单元,然后取得该新单元的值;

- foreache遍历流程原理图:
foreach( $数组变量名 as $key => $value ){
//循环体;这里可以去“使用”$key 和 value;
//$key 和 $value 就是该遍历语句一次次取得的数组的每一个单元(项)的下标和对应值。
//而且,它总是从数组的开头往后按顺序取数据。
}
其基本原理示意图如下:


输出结果为:

可见:遍历之后,指针已经超出数组合理位置了。
使用for和next遍历数组
注意:对php数组,往往不能单纯使用for循环进行遍历。
或者说:php中,使用for循环只能循环“下标为连续的纯整数数组”;

结果:

each()函数的使用
each()函数的作用:先取得一个数组的“当前单元”的下标和值(并放入一个数组),然后将指针移到下一个单元。
使用形式:
$a = each($数组名); //此时$a就是一个数组了

list()“函数”的使用:
list()函数用于一次性取得一个数组中从0开始的数字下标的多个单元的值!
形式:
list($变量1,$变量2,$变量3, .. ) = $数组;
作用:
上述一行代码相当于如下代码:
$变量1 = $数组[0];
$变量2 = $数组[1];
$变量3 = $数组[2];
........
注意:这里变量的个数,要跟该数组的数字下标的单元对应,如果某个变量对应的该数字下标不存在,就会报错!


while+each()+list()遍历数组

数组变量的一些细节
foreach也是正常的循环语法结构,可以有break和continue等操作。
遍历过程中值变量默认的传值方式是值传递。

结果为:

遍历过程中值变量可以人为设定为引用传递:foreach($arr as $key => &$value){ ... }

结果为:

foreach默认是原数组上进行遍历。但如果在遍历过程中对数组进行了某种修改或某种指针性操作,则会复制数组后在复制的数组上继续遍历循环(原数组保持不变)。
以下演示的是“foreach默认是原数组上进行遍历”的效果:

然后,再演示:在某些情况下(修改或指针操作),不是在原数组身上进行遍历。

结果为:

foreach中如果值变量是引用传递,则无论如何都是在原数组上进行。


数组排序
排序函数简单演示(应用级别):

结果为:


结果为:

更多排序函数,请查手册:
- 手册》函数参考》与变量有关的扩展》数组》Sorting Arrays

冒泡排序算法
演示数组为:
$a = array(9, 3, 5, 8, 2, 7); //下标为0,1,2,3,4,5
演算过程描述:
从数组的左边开始,依次两两比较相邻的2个数据的大小,如果发现左边的比右边的大,则将他们进行交换。这样进行“一趟”之后,必然可以确定最大的一个数据放在最右边。
按此方式,对“剩余的数据”继续进行下一趟,则有会确定这些剩余数据耳朵最大值放在剩余位置的最右边。
演示:
|
原始数组: |
9 |
3 |
5 |
8 |
2 |
7 |
|
第1趟后: |
3 |
5 |
8 |
2 |
7 |
9 |
|
第2趟后: |
3 |
5 |
2 |
7 |
8 |
9 |
|
第3趟后: |
3 |
2 |
5 |
7 |
8 |
9 |
|
第4趟后: |
2 |
3 |
5 |
7 |
8 |
9 |
|
第5趟后: |
2 |
3 |
5 |
7 |
8 |
9 |
规律描述:
- 假设数组的数据有n个。
- 要进行比较的“趟数”为n-1;
- 每一趟要比较的数据个数都比前一趟少一个,第一趟要比较n个(即比较n-1次)
- 每一次比较,如果发现“左边数据”大于“右边数据”,就对这两者进行交换位置。
代码演示如下:

演示数组为:
$a = array(9, 3, 5, 8, 2, 7); //下标为0,1,2,3,4,5演算过程描述:
求得一个数组的最大值的下标,并将这个最大值下标的单元跟最后一个单元进行交换;
然后,继续从剩余数据中取得最大值的下标,并将这个最大值下标的单元跟剩余的最后一个单元交换
以此类推,直到只剩下一个数据,就不用找了。
演示:
|
原始数组: |
9 |
3 |
5 |
8 |
2 |
7 |
|
第1趟后: |
7 |
3 |
5 |
8 |
2 |
9 |
|
第2趟后: |
7 |
3 |
5 |
2 |
8 |
9 |
|
第3趟后: |
2 |
3 |
5 |
7 |
8 |
9 |
|
第4趟后: |
2 |
3 |
5 |
7 |
8 |
9 |
|
第5趟后: |
2 |
3 |
5 |
7 |
8 |
9 |
规律描述:
- 假设数组的数据有n个。
- 要进行查找最大值单元并进行交换的“趟数”为n-1;
- 每一趟都要求出“剩余数据”中的最大值单元,并且,剩余数据的数量每一趟都少1个,第一趟有n个。
- 每一趟找出最大值单元后,都要进行交换:最大值单元,跟剩余数据中的最后一个单元交换。

php : 基础(6)的更多相关文章
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- node-webkit 环境搭建与基础demo
首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
随机推荐
- AVD之PANIC: Could not open
1 原因一:因为我们采用的是绝对路径定位,也就是说在环境变量里面把路径写死了,所以安装都不同,路径读不出来. 解决办法:①在环境变量中创建变量名:ANDROID_SDK_HOME,变量值:你当时安装S ...
- VR原理讲解及开发入门
本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持. 1. VR沉浸感和交互作用产生的原理: 在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR ...
- Infinite V1 Release Note
游戏地址 PLAY 玩法说明 WASD 控制角色移动 更新内容 - 初步完成了角色移动(攻击状态) 开发心得 独立做游戏 其实最耽误时间的就是在自己的短板上, 对于我来说 就是3D建模和动作制作. ...
- [转] vim自定义配置 和 在ubnetu中安装vim
Ubuntu 12.04安装vim和配置 问题: ubuntu默认没有安装vim,出现: jyg@ubuntu:~$ vim test.cThe program 'vim' can be foun ...
- 桌面显卡天梯图和桌面cpu天梯图
桌面cpu天梯图: 桌面显卡天梯图:
- 利用 Serial Over Lan(SOL)搭建 XEN 的调试信息输出环境
如有转载,请注明出处与本文连接,谢谢! 修改XEN的源码实现额外的功能,需要有一个调试环境来得到XEN的调试信息(有关源码编译并安装 XEN 请阅读我以前的博文:在CentOS下源码安装 Xen并搭建 ...
- MIL 多示例学习 特征选择
一个主要的跟踪系统包含三个成分:1)外观模型,通过其可以估计目标的似然函数.2)运动模型,预测位置.3)搜索策略,寻找当前帧最有可能为目标的位置.MIL主要的贡献在第一条上. MIL与CT的不同在于后 ...
- 初学软件测试之——如何使用Junit4
前几天刚刚接触软件测试,这篇文章主要是介绍使用eclipse的插件——Junit4进行单元测试.下面先介绍一下单元测试的定义:单元测试(unit testing),是指对软件中的最小可测试单元进行检查 ...
- java 使用 集合 制作学生管理系统
以上是文件组织结构 下面是个.java的具体代码: package com.collection.students.pojo; public class Student { private Strin ...
- 程序员面试大揭秘——应聘微软、亚马逊、谷歌、苹果等IT公司你都要做什么准备?
对于多数求职者而言,面试好似一个迷局.你去了,见了几个面试官,答了一堆问题,然后,或两手空空离开,或幸运地拿到录用通知. 你有没有想过: 面试结果是怎么得出的? 面试官会不会互相交流? 公司最看重哪些 ...