数组
数组的定义
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
查找算法:
上图代码演示了顺序查找.