数组
数组概念
数组定义语法 👉 跟Kotlin很像
三种方式:
- array关键字 🐘 $变量 = array(元素1,元素2,元素3..);
- [] 🐘 $变量 = [元素1,元素2…];
- 隐形定义数组
//1.定义数组:array
$arr1 = array('1',2,'hello');
var_dump($arr1);
🍎
array(3) { [0]=> string(1) "1" [1]=> int(2) [2]=> string(5) "hello" }
//2.定义数组:[]
$arr2 = ['1',2,'hello'];
var_dump($arr2);
🍎
array(3) { [0]=> string(1) "1" [1]=> int(2) [2]=> string(5) "hello" }
//3.隐形定义数组:给变量增加一个中括号,系统自动变成数组
$变量[] = 值1; //如果不提供下标也可以,系统自动生成(数字:从0开始)
$变量[下标] = 值; //中括号里面的内容称之为下标key,该下标可以是字母(单词)或者数字,与变量命名的规则相似
//隐形数组:
$arr3[] = 1;
$arr3[10] = 100;
$arr3[] = '1'; // [11]=> string(1) "1"
$arr3['key'] = 'key';
$arr3[1] = 'value'; // [1]=> string(5) "value"
$arr3[] = 'xxx'; // [12]
var_dump($arr3);
🍎
array(6) { [0]=> int(1) [10]=> int(100) [11]=> string(1) "1" ["key"]=> string(3) "key" [1]=> string(5) "value" [12]=> string(3) "xxx" }
如图
PHP数组特点
1. 可以整数下标或者字符串下标
如果数组下标都为整数:索引数组
如果数组下标都为字符串:关联数组
2. 不同下标可以混合存在:混合数组
3. 数组元素的顺序以放入顺序为准,跟下标无关
4. 数字下标的自增长特性:从0开始自动增长,如果中间手动出现较大的,那么后面的自增长元素从最大的值+1开始
5. 特殊值下标的自动转换
布尔值:true 和 false
空:NULL
🌰
//特殊下标转换
$arr4[false] = false;
$arr4[true] = true;
$arr4[NULL] = NULL;
var_dump($arr4);
🍎
array(3) { [0]=> bool(false) [1]=> bool(true) [""]=> NULL }
6. PHP中数组元素没有类型限制
7. PHP中数组元素没有长度限制
补充:PHP中的数组是很大的数据,所以存储位置是堆区 ,为当前数组分配一块连续的内存。
多维数组
在第二维的数组元素中可以继续是数组,在PHP中没有维度限制(PHP本质并没有二维数组)
但是:不建议使用超过三维以上的数组,会增加访问的复杂度,降低访问效率。
//定义二维数组
$info = array(
array('name' => 'Jim','age' => 30),
array('name' => 'Tom','age' => 28),
array('name' => 'Lily','age' => 20)
//最后一个元素,后面可以跟逗号不影响(不建议)
);
echo '<pre>';
print_r($info);
print_r($info[1]['age']);
🍎
Array
(
[0] => Array
(
[name] => Jim
[age] => 30
)
[1] => Array
(
[name] => Tom
[age] => 28
)
[2] => Array
(
[name] => Lily
[age] => 20
)
)
28
数组遍历
遍历的基本含义
数组遍历:普通数组数据的访问都是通过数组元素的下标来实现访问,如果说数组中所有的数据都需要依次输出出来,就需要我们使用到一些简化的规则来实现自动获取下标以及输出数组元素。
$arr = array(0=>array(‘name’ => ‘Tom’),1=>array(‘name’ => ‘Jim’)); //二维数组
//访问一维元素:$arr[一维下标]
$arr[0]; //结果:array(‘name’ => ‘Tom’);
//访问二维元素:$arr[一维下标][二维下标
$arr[1][‘name’]; //Jim
Foreach遍历语法
//定义数组
$arr = array(1,2,3,4,5,6,7,8,9,10);
//foreach循环
foreach($arr as $v){
//$v 随意命名
echo $v,'<br/>';
}
如果是 key => value 形式
//foreach循环
foreach($arr as $k => $v){
//$v 随意命名
echo 'key:',$k,' == value:',$v,'<br/>';
}
🍎
key:0 == value:1
key:1 == value:2
key:2 == value:3
key:3 == value:4
key:4 == value:5
key:5 == value:6
key:6 == value:7
key:7 == value:8
key:8 == value:9
key:9 == value:10
实操:
$arr = array(
0 => array('name' => 'Tom','age' => 30),
1 => array('name' => 'Jim','age' => 28)
);
//通过foreach遍历一维元素
foreach($arr as $value){
//1、可以继续遍历:增加foreach遍历$value
//2、可以使用下标访问
echo 'name is : ' ,$value['name'],' and age is : ',$value['age'],'<br/>';
}
🍎
name is : Tom and age is : 30
name is : Jim and age is : 28
Foreach遍历原理
Foreach遍历的原理:本质是数组的内部有一颗指针,默认是指向数组元素的第一个元素,foreach就是利用指针去获取数据,同时移动指针。
- foreach会重置指针:让指针指向第一个元素;
- 进入foreach循环:通过指针取得当前第一个元素,然后将下标取出放到对应的下标变量$k中(如果存在),将值取出来放到对应的值变量$v中;(指针下移)
- 进入到循环内部(循环体),开始执行;
- 重复2和3,直到在2的时候遇到指针取不到内容(指针指向数组最后)
foreach($arr as $k => $v){ //循环体 }
For循环遍历数组
使用关键字 count(数组) 得到数组元素的长度
//数组特点:索引数组,下标规律
$arr = array(1,2,3,4,5);
for($i = 0,$len = count($arr); $i < $len; $i++){
echo 'key is : ',$i,' and value is : ' , $arr[$i],'<br/>';
}
🍎
key is : 0 and value is : 1
key is : 1 and value is : 2
key is : 2 and value is : 3
key is : 3 and value is : 4
key is : 4 and value is : 5
while配合each和list遍历数组
while是在外部定义边界条件,如果要实现可以和for循环一样。
each 函数使用:each 能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到之后将数组指针下移,同时将拿到的元素下标和值以一个四个元素的数组返回:
0下标 – 》 取得元素的下标值
1下标 - 》 取得元素的值
Key下标 – 》取得元素的下标值
Value下标 – 》取得元素的值
each
//while配合each和list遍历数组
$arr = array(5,4,'name' => 'Tom',3,'age' => 30);
echo '<pre>';
//each函数指针操作
print_r(each($arr));
print_r(each($arr));
print_r(each($arr));
print_r(each($arr));
print_r(each($arr));
//超出元素个数后 👉 bool(false)
print_r(each($arr));
🍎
Deprecated: The each() function is deprecated. This message will be suppressed on further calls in C:\fastwork\Apache24\htdocs\test.php on line 9
Array
(
[1] => 5
[value] => 5
[0] => 0
[key] => 0
)
Array
(
[1] => 4
[value] => 4
[0] => 1
[key] => 1
)
Array
(
[1] => Tom
[value] => Tom
[0] => name
[key] => name
)
Array
(
[1] => 3
[value] => 3
[0] => 2
[key] => 2
)
Array
(
[1] => 30
[value] => 30
[0] => age
[key] => age
)
bool(false)
list
List函数使用:list是一种结构,不是一种函数(没有返回值),是list提供一堆变量去从一个数组中取得元素值,然后依次存放到对应的变量当中(批量为变量赋值:值来源于数组):list必须从索引数组中去获取数据,而且必须从0开始。
正确操作:
//list结构
$arr = array(1,2 => 1);
list($first) = $arr;
var_dump($first);
🍎
int(1)
错误操作:
//list结构
$arr = array(5,2 => 1);
//错误:second变量对应的下标为元素下标1的,但是数组没有
list($first,$second) = $arr;
var_dump($first,$second);
🍎
Notice: Undefined offset: 1 in C:\fastwork\Apache24\htdocs\test.php on line 9
int(5) NULL
若改为:
//list结构
$arr = array(5,3);
//错误:second变量对应的下标为元素下标1的,但是数组没有
list($first,$second) = $arr;
var_dump($first,$second);
🍎
int(5) int(3)
list 与 each 配合特别好:each 一定有两个元素就是0和1下标元素 list (变量1,变量2) = each(数组); //是一种赋值运算,但是可以得到false结果(each取不到正确的结果),整个表达式为false
错误用法:
//while循环
$arr = array(1,'name' => 'Tom',3,'age' => 30);
while(each($arr)){
//list搭配each
list($key,$value) = each($arr);
//输出
echo 'key is :' . $key . ' value is :' . $value . '<br/>';
}
🍎 输出不全: 1和3在上面
key is :name value is :Tom
key is :age value is :30
正确做法:
//while循环
$arr = array(1,'name' => 'Tom',3,'age' => 30);
while(list($key,$value) = each($arr)){
//list搭配each
//list($key,$value) = each($arr);
//输出
echo 'key is :' . $key . ' value is :' . $value . '<br/>';
}
🍎
key is :0 value is :1
key is :name value is :Tom
key is :1 value is :3
key is :age value is :30
基于特性: each 遍历到最后返回false ; each 指针下移 ; list key index 0,value index 1 。
数组的相关函数
1. 排序函数
sort 顺序排序(下标重排)
rsort 逆序排序
asort 顺序排序(下标保留)
ksort 顺序排序:按照键名(下标)
krsort 逆序排序
shuffle 随机打乱数组元素
🌰
//排序函数
$arr = array(3,1,5,2,0);
echo '<pre>';
$sort_arr = sort($arr);
print_r($arr);
🍎
//1.sort
Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 5
)
//2.asort(下标保留)
Array
(
[4] => 0
[1] => 1
[3] => 2
[0] => 3
[2] => 5
)
//3.krsort
Array
(
[4] => 0
[3] => 2
[2] => 5
[1] => 1
[0] => 3
)
2. 指针函数,比如: reset,end,next,prev,;
reset():重置指针,将数组指针回到首位
end():重置指针,将数组指针指导最后一个元素
next():指针下移,取得下一个元素的值
prev():指针上移,取得上一个元素的值
current():获取当前指针对应的元素值
key():获取当前指针对应的下标值
🌰
$arr = array(3,1,5,2,0);
//指针函数
//**默认为第一个元素**
echo current($arr),'<br/>';
echo key($arr),'<br/>';
echo next($arr),next($arr),'<br/>';
echo prev($arr),'<br/>';
echo end($arr),'<br/>';
echo reset($arr),'<br/>';
🍎
3
0
15
1
0
3
注意事项:next和prev会移动指针,有可能导致指针移动到最前或者最后(离开数组), 导致数组不能使用,即通过next和prev不能回到真确的指针位置。只能通过end或者reset进行指针重置
3. 其他函数
count():统计数组中元素的数量
array_push():往数组中加入一个元素(数组后面)
array_pop():从数组中取出一个元素(数组后面)
array_shift():从数组中取出一个元素(数组前面)
array_unshift():从数组中加入一个元素(数组前面)
PHP模拟数据结构: 👇
栈:压栈,先进去后出来(FILO)
//模拟数据结构:栈和队列
$arr = array();
//栈:先压栈后出栈:都是从一端出来
//前面:array_shift/array_unshift
//后面:array_push/array_pop
//压栈
array_push($arr,3);
array_push($arr,2);
array_push($arr,1);
echo '<pre>';
print_r($arr);
//出栈
echo array_pop($arr),array_pop($arr),array_pop($arr),'<br/>';
🍎
Array
(
[0] => 3
[1] => 2
[2] => 1
)
123
队列:排队,先进去的先出去(FIFO)
//队列:先排队,先出来,一端进,另外一端出
//后进前出:array_push/array_shift
//前进后出:array_unshift/array_pop
$arr = array();
//入队
array_unshift($arr,3);
array_unshift($arr,2);
array_unshift($arr,1);
echo '<pre>';
print_r($arr);
//出队
echo array_pop($arr),array_pop($arr),array_pop($arr),'<br/>';
🍎
Array
(
[0] => 1
[1] => 2
[2] => 3
)
321
其他
- array_reverse():数组元素反过来
$arr = array(1,2,3,6,5); print_r(array_reverse($arr)); 🍎 Array ( [0] => 5 [1] => 6 [2] => 3 [3] => 2 [4] => 1 )
- in_array():判断一个元素在数组中是否存在
$arr = array(1,2,3,6,5); var_dump(in_array(6,$arr)); var_dump(in_array(100,$arr)); 🍎 bool(true) bool(false)
- array_keys():获取一个数组的所有下标,返回一个索引数组
- array_values():获取一个数组的所有值,返回一个索引数组
$arr = array(1,2,3,6,5); echo '<pre>'; print_r(array_keys($arr)); print_r(array_values($arr)); 🍎 Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 ) Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 6 [4] => 5 )