php学习笔记05:数组

数组

数组的定义

1、使用array关键字,格式为:

$变量=array(元素1,元素2,元素3...);//这种方式系统自动赋予数字下标,从0开始

2、使用中括号包裹数据,格式为:

$变量=[元素1,元素2,元素3...];//不指定下标的话,系统自动赋予下标,从0开始

3、隐形数组

PHP数组特点

1、可以整数下标也可以KEY下标

如果下标都为整数,称为索引数组

如果下标都为KEY,成为关联数组

2、不同下标可以混合存在:混合数组

3、数组元素的顺序以放入顺序为准,跟下标无关

4、数组下标的自增长性

5、特殊值下标的自动转换:为阅读流畅应避免这种方式命名下标。

布尔值:true和false

空:NULL

6、php中数组元素没有类型限制

7、php中数组元素没有长度限制

补充:php中的数组是很大的数据,所以存储位置是堆区,为当前数组分配一块连续的内存。

多维数组

数组里面的元素又是数组。

*在PHP中没有维数限制。但是为流畅性和结构化,不建议超过三维以上数组。也会增加复杂度、降低访问效率。

二维数组:

数组里面所有元素都是一维数组。

异形数组(不规则数组):

数组中的元素不规则,有普通基本变量,也有数组。

在实际开发中并不常用,我们一般尽量让数组元素规则化(便于访问)。

echo '二维数组演示<br>';

for($i=1;$i<10;$i++){
	for($j=1;$j<10;$j++){//可将$j<10改成$j<=$i;可得到真正九九乘法表。但二维数组将成为不规则数组
			$二维数组[$i][$j]=$i*$j;//使用一个规则二维数组存储九九乘法表每一项的积
			echo $i.'X'.$j.'='.$二维数组[$i][$j].' '; 	//输出每一项形如x*y=z
	}
	echo '<br>';//内层循环结束后换行。
}
var_dump($二维数组);//直观的查看这个存积的二维数组

遍历数组:

遍历的基本含义:

foreach遍历语法

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement

如上图代码,演示了foreach两种遍历。

在进行数据存储定义的时候,通常二维数组不会两个维度的key下标都为数字,一般是一维为数字(无意义),二维为字符串(数据库表字段),所以在进行遍历的时候,通常只需要对一维数组进行遍历,取得二维数组元素,然后二维数组通过下标去访问。如下例所示。

foreach遍历原理:

本质是数组内部有一个指针,默认指向数组第一个元素。foreach利用指针获取数据,同时移动指针。

1、foreach会重置指针,让指针指向第一个元素。

2、进入foreach循环,通过指针取得当前第一个元素,然后将下标取出,放到对应的下标变量中(如果存在),将值取出来放到对应的值变量中。指针下移。

3、进入循环内部(循环体),开始执行;

4、重复2-3,直到在2的时候遇到指针取不到内容(指针指向数组最后),即结束。

for循环遍历数组

如上图代码演示for循环遍历数组。注意$len=count($arr)放置于循环起始处,使得它只计算一次。

while配合each和list遍历数组

each函数

返回数组中当前的键/值对并将数组指针向后移动一步。*注意:自PHP 7.2.0起,此函数已被弃用。 非常不鼓励依赖此功能。

如果调用each函数,数组指针已经移动到数组尾部;此时继续调用each,则因为指针无法再向后移动返回false。

如上图代码。调用4次each,数组指针已经到数组尾部再无数组元素(本数组只有4个元素)。此时继续调用each函数,返回false。

list:

语法:list ( mixed $var1 [, mixed $... ] ) : array

功能: 把数组中的值赋给一组变量。理论上它是一种结构而不是函数。像 array() 一样,这不是真正的函数,而是语言结构。 list() 可以在单次操作内就为一组变量赋值。

Note:

在 PHP 7.1.0 之前的版本,list() 仅能用于数字索引的数组,并假定数字索引从 0 开始。

警告:

PHP 5 里,list() 从最右边的参数开始赋值; PHP 7 里,list() 从最左边的参数开始赋值。

如果你用单纯的变量,不用担心这一点。 但是如果你用了具有索引的数组,通常你期望得到的结果和在 list() 中写的一样是从左到右的,但在 PHP 5 里实际上不是, 它是以相反顺序赋值的。

通常而言,不建议依赖于操作的顺序,在未来可能会再次发生修改。

警告:

在 list() 执行过程中修改数组(比如使用 list($a, $b) = $b)将会产生不可预知的结果。

如上图代码演示,$arr数组有两个元素,0号元素和2号元素(缺1号元素)。

list是按索引号顺序自动寻找数组元素的,因此在如上语句中$firtst指定为第一个元素即0号元素,则$second自动顺序指定为下一个元素即索引为1号的元素,但是明显数组中不存在该元素,因此系统报错。

list与each配合特别好:each(共4个元素,其中)含2个元素就是0和1下标元素。

list(变量1,变量2)=each(数组);//是一种赋值运算,但是可以得到false结果(each指针已移动到数组尾部,此时取不到正确的结果)

数组相关的函数:

1、排序函数:都是按照ascii码顺序比较

sort函数:对数组顺序排序((排序后下标重置))

语法:sort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) : bool

本函数对数组进行排序。当本函数结束时数组单元将被从最低到最高重新安排。

注意:

如果两个成员比较相等,则它们在排序数组中的相对顺序是未定义的。

参数

array

要排序的数组。

sort_flags

可选的第二个参数 sort_flags 可以用以下值改变排序的行为:

排序类型标记:

  • SORT_REGULAR - 正常比较单元(不改变类型)
  • SORT_NUMERIC - 单元被作为数字来比较
  • SORT_STRING - 单元被作为字符串来比较
  • SORT_LOCALE_STRING - 根据当前的区域(locale)设置来把单元当作字符串比较,可以用 setlocale() 来改变。
  • SORT_NATURAL - 和 natsort() 类似对每个单元以“自然的顺序”对字符串进行排序。 PHP 5.4.0 中新增的。
  • SORT_FLAG_CASE - 能够与 SORT_STRING 或 SORT_NATURAL 合并(OR 位运算),不区分大小写排序字符串。

返回值

成功时返回 TRUE, 或者在失败时返回 FALSE

rsort():对数组逆序排序。(排序后下标重置)

如上图代码,排序之后,下标被重置了.

asort():排序(保留原有下标)

arsort():逆序排序(保留原有下标)

如上图代码,排序后原有下标保留,并未改变.

ksort():顺序排序(按key排序)

krsort():逆序排序(按KEY排序)

如上图代码,krsort按key值逆序排列.

shuffle(数组):随机打乱数组元素,下标会重置

如上图代码,shuffle随机打乱数组元素.下标会重置.

2数组指针函数

reset():重置指针,指针指向第1个元素并获取元素值

end():重置指针,指针指向最后1个元素并获取元素值

next():指针下移一位.,获取该元素值,无效则返回false

prev():指针上移一位.获取该元素值,无效则返回false

current():获取当前指针对应的元素值.,无效则返回false

key():获取当前指针对应的key/下标

注意事项:假如指针在首位再使用prev;假如指针在最后1个元素再使用next,导致指针超出范围,且无法再用指针使用数组,此时只能使用end或reset重置指针.

echo '无效数组指针演示<br>';
$arr=array(1,2,3,4,5);//默认指针在首位
var_dump(prev($arr));//将首位的指针向前移动一位,无效,返回false
var_dump(current($arr));//此时数组指针已经无效,获取当前指针无效,返回false
var_dump(key($arr));//因为当前指针无效,当前key值返回null

上例演示数组指针错误操作后指针变为无效及返回值.

3其他函数

count():获取数组元素数量.

array_push():在数组尾部添加1个或多个元素(压入),返回处理之后数组元素个数.

array_pop();去除数组最后1个元素(弹出),并返回该元素值.

array_shift():去除数组第一个元素,并返回该元素值.

array_unshift():在数组首部插入1个或多个元素.,返回处理之后数组元素个数.

PHP模拟数据结构:

栈:压栈,先进后出(FILO)

队列:类似排队,先进先出(FIFO)

array_reverse():返回单元顺序相反的数组

in_array();判断一个元素在数组中是否存在

array_keys();获取1个数组的所有下标,返回1个索引数组

array_values():获取1个数组的所有值,返回1个索引数组.

编程思想:

递推算法

递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法.递推算法分顺推和逆推.

顺推:通过最简单的已知条件,然后逐步推演结果.

逆推:通过结果找到规律,然后推到已知条件.

下例求斐波那契数列

递归算法:

1简化问题:找到最优子问题(不能再小了)

2函数自己调用自己

递归算法很容易把系统资源糟蹋完,慎用!

数组排序算法

冒泡算法

冒泡排序视频:https://www.bilibili.com/video/av12863134/?p=91

选择排序视频:https://www.bilibili.com/video/av12863134/?p=92

插入排序视频:https://www.bilibili.com/video/av12863134/?p=93

快速排序视频:https://www.bilibili.com/video/av12863134/?p=94

归并排序视频:https://www.bilibili.com/video/av12863134/?p=95

查找算法:

上图代码演示了顺序查找.

二分查找法视频:https://www.bilibili.com/video/av12863134/?p=96

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值