数组
不妨先看一下度娘的解释
定义语法
<?php
//1.用array关键字
$变量 = array(元素1,元素2,元素3);//元素可以为不同类型
//2.用中括号
$变量 = [元素1,元素2,元素3];
//3.隐形定义数组:(给变量增加一个中括号,系统自动变成数组
$变量[] = 值;//从0开始默认储存,但是如果前面有下标了,下标默认从当前前面最大的开始
$变量[下标] = 值;//下表可以是字母(单词)/数字
$a[] = 10;
$a[10] = 11;
$a[] = 12;//这时候下标在11
特点
-
1.可以用整数下标或字符串下标。
如果下标都为整数下标:‘索引数组’
如果下标都为字符串(加引号):'关联数组'(类似python中的dict?
-
2.不同下标可以混合存在(混合数组
-
3.数组元素的顺序以放入顺序为准,跟下标无关
就是输出的时候,如果不循环,就按着赋值顺序输出。(var_dump($a)
-
4.数组下标的自增长特性:从0开始自动增长,如果中间出现较大的下标,从最大的下标+1重新开始增长
-
5.特殊值下标的自动转换
-
6.php中数组元素没有类型限制
-
7.php中数组元素原则上没有长度限制
注意:PHP中数组是很大的数据,存储位置是堆区,为当前数组分配连续的内存。
多维数组
数组里面的元素又是数组。
二维数组:
数组中所有元素都是一维数组。
<?php
$aa = array(
array('name' => 'ghj','score' => 99),
array('name' => 'gc','score' => 99),
array('name' => 'guz','score' => 0)
);
//其实就是套起来用。(不妨自己输出试试
通常二维数组不会两个维度的下标都是数字,一般是一维为数字(无意义),二维为字符串(数据库表字段)。
多维数组:
在二维里面继续套娃(php中没有维度限制,但是php本质没有二维数组。 禁止套娃 (尽量少用大于三维的数组。
异形数组(不规则数组:
数组中的元素不规则,有普通基本变量也有数组。(可能就是啥玩意都有?)
(开发中不常见。应该尽量让数组元素规则化,便于访问
数组遍历
普通数组数据的访问都是通过下标来访问。如果依次输出,就能用foreach;(下标不规则通通用foreach
foreach
<?php
$a = array(0 => array('name') => 'ghj'),1 => array('name' => 'gc');
//访问一维元素:
$a[0];
//访问二维元素:(像c语言一样
$a[0]['name'];
/*foreach遍历语法:
foreach($数组变量 as [$下标 => ]$值){
//通过 $下标 访问元素的下标;通过 $值 来访问元素值
}
如果是关联数组的时候,就需要下标。
如果是索引数组,就直接访问值(可以不要下标
*/
$aa = array(1,2,3,4,5,6,7,8,9,10);
foreach($aa as $key => $value){
//$key,$value写成啥都行
//其中$key对应下标,$value对应值
echo $value,'<br/>';
}
//遍历二维数组
$bb = array(
array('name' => 'ghj','score' => 99),
array('name' => 'gc','score' => 99),
array('name' => 'guz','score' => 0)
);
foreach($bb as $val){
//1.foreach($val as $value)
/*2.直接通过下标访问
echo $val['name'],' ',$val['score'];*/
}
foreach遍历原理:
数组内部有一颗指针,默认指向第一个元素。foreach是利用指针去获取数据,同时移动指针。(指针访问
- foreach会重置指针:让指针指向第一个元素
- 进入foreach循环:通过指针取得第一个元素,然后将下标取出放到对应的下标变量中(存在的话),将值取出来放到对应的值变量中。指针下移
(对于上面的一维数组遍历就是下标放到$key,值放到$value
- 进入到循环体之后,开始执行。
- 重复2,3,直到取不到内容。
for
就是用for循环(很少用到
该怎么做?
首先要确保数组元素的下标是有规律有顺序的数字。
要获取数组长度:count(数组)
来得到数组长度
<?php
$a = array(1,2,3,4,5,6,7,8,9);
$len = count($a);
for($i = 0;$i < len;$i++){
echo 'key is :',$i,' val is :',$a[$i],'<br/>';
}
while配合each和list遍历数组
(其实也可以用for。
each函数:each能够从一个数组中获取当前数组指针指向元素的下标和值,拿到之后将数组指针下移,同时返回拿到的元素下标和值以一个四个元素的数组返回。
(each函数貌似弃用了,但是还是有可能会接触到的
当each取不到东西的时候,会返回false。(var_dump可显示
list函数:list是一种结构,没有返回值的概念。list提供一堆变量去从一个数组中取得元素值,然后依次存储到对应的变量中。(list必须从索引数组中去获取数据,必须从0开始。
(整段建议细读,应该不难理解)
list()里面的变量不可多于数组元素。(只能按顺序来,下面面的赋值如果改为```list((first,)second) = $arr;``是不可行的(因为数组中第二个是赋值的a[2]。
list 与each配合:
(一定注意理解两个函数的意思与用法
each一定有两个元素:0和1
list(变量1,变量2) = each(数组);//是一种赋值运算,但是可以得到false结果(each取到不正确的),此时表达式为false
<?php
$a = array(1,'name' => 'ghj',3,'score' => 99);
while(each($a)){
list($key,$value) = each($a);
echo 'key is :',$key,' value is :',$value,'<br/>';
}
//注意each每次使用之后都会将指针下移!
//这时候只能输出第二个和第四个
//像下面这样写就可以将四个都输出:
while(list($key,$value) = each($a)){
echo 'key is :',$key,' value is :',$value,'<br/>';
}
//该怎么理解呢?按我的理解来看就是each没有取到空的时候的返回值都是true,就都可以执行。
数组相关函数
所有的函数,详见此处
1.排序函数:
(按ascii来进行比较 详情可见此处
-
sort():升序排序。(下标会重置。
-
rsort():降序排序。
-
asort():按照元素的值进行升序排序。(下标会保留)(主要应用于关联数组
-
arsort():降序排序
怎么来解释呢,就比如说这样(注意看下标
<?php $a = array(1,10,2,45,30); /* sort($a)后会得到这样的结果 [0] => 1 [1] => 2 [2] => 10 [3] => 30 [4] => 45 */ /* 而asort($a)之后则是这样的结果 [0] => 1 [2] => 2 [1] => 10 [4] => 30 [3] => 45 */
- ksort():按照键名进行升序排序(应用于关联数组
- krsort():降序排序。
- shuffle():随机打乱数组的值。
2.指针函数:
建议自己尝试一下 详见此处
- reset():重置指针,将数组指针回到首位
- end():重置指针,将数组指针指到最后一个元素
- next():指针下移,取得下一个元素的值
- prev():指针上移,取得上一个元素的值
- current():取得当前指针对应的元素值
- key():取得当前指针对应的下标值
注意:当next/prev函数使得指针越界之后,用这两个是调用不回来的,需要用end/reset重置
3.其他函数
- count():统计数组中元素数量(或者说长度?
- array_push(数组,元素):在数组尾部新加入一个元素
- array_pop(数组,元素):从数组尾部返回并删除一个元素。(这两个操作可理解成栈?
- array_shift(数组,元素):从数组头部返回并删除一个元素。
- array_unshift(数组,元素,):从数组头部加入一个元素(这两个可以理解成队列?
- array_reverse():翻转数组元素
- in_array():判断元素是否在数组中。
- array_keys():获取数组的所有下标,返回值为一个索引数组
- array_values():获取数组的所有值,返回值也是一个索引数组。