学习教程来源于:
PHP中文网教程
PHP官网PHP手册(简体中文)链接
数组的定义与分类
数组:键值对的集合
键名:
整数、字符串(不是则会自动转换为这俩种类型)
值:
①标量(整数型、浮点型、字符串、布尔型)
②复合(数组:多维数组、对象)
按键名类型分类: 1.索引数组: 键名默认是从零开始顺序递增的整数 可自定义键名,若重复,后面会覆盖前面 2.关联数组: 键名是字符串,用引号包装 如果重复,后面覆盖前面
<?php
// 创建一个索引数组
// 执行的是下舍入,指定了索引的值,其后的值的键名会递增
$arr = ['html', 3.8=>'css', 'javascript'];
echo '<pre>';
print_r($arr); //输出数组
echo '</pre>';
echo '<hr/>';
// 创建一个关联数组
$arr1 = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
echo '<pre>';
print_r($arr1); //输出关联数组
echo '</pre>';
数组的创建与访问:
创建:
①初始化创建
②直接给元素赋值来创建
③先声明空数组再添加
访问:
①整体访问:print_r( a r r ) / v a r d u m p ( arr)/var_dump( arr)/vardump(arr)
②逐个访问:echo a r r a y [ array[ array[key]/var_daump( a r r a y [ array[ array[key],可同时访问多个)
<?php
// 初始化创建一个数组
$arr = [12, 44, 'abc']; //默认索引数组
// 键名默认从0开始递增
// 与下面等效
$arr = [0=>12, 1=>44, 2=>'abc'];
// 值可以是任何类型
$arr = ['html', 'css', 'javascript'];
echo '<pre>';
print_r($arr);
echo '<pre/>';
// 等价于
$arr = [0=>'html', 1=>'css', 2=>'javascript'];
// 初始化创建一个关联数组
$arr1 = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
echo '<pre>';
print_r($arr1);
echo '</pre>';
// 直接给元素赋值创建数组
// 第一行语句,赋值的同时,创建数组
$arr['name'] = 'php';
// 从第二行语句起,想语句中添加元素
$arr['domain'] = 'www.php.cn';
// 继续向数组中添加
$arr['pageTitle'] = 'php中文网';
// 初始化创建一个关联数组
// $arr1 = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
// 创建一个空数组
$arr = [];
// 向数组中添加元素
$arr[] = 10;
$arr[1] = 20;
$arr['age'] = 30;
// 不指定键名,默认是递增的整数
echo '<pre>';
print_r($arr);
echo '</pre>';
// 访问某一个数组元素
echo $arr[1].'<br/>';
echo $arr['age'];
数组指针
- current():获取指针当前位置的元素的值
- key():获取指针当前元素的键名(索引)
- next():指针移动到下一个元素
- prev():指针移动到上一个元素
- end():指针移动到最后一个元素
- reset():指针复位到第一个元素
数组的遍历:
for循环
索引数组遍历
关联数组遍历
<?php
// 用for语句进行索引数组的遍历
$arr = range(1,10); //生成一个1-10的整数数组
// echo '<pre>';
// print_r($arr);
// echo '</pre>';
// echo '$arr数组的元素个数:'.count($arr);
for($i=0; $i<count($arr); $i++) {
echo $i.'=>'.$arr[$i].'<br/>';
echo '第'.($i+1).'个元素的值是:'.$arr[$i].'<br/>';
}
// 用for语句进行关联数组的遍历
$arr = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
for($i=0; $i<count($arr); $i++){
echo key($arr),'=>',current($arr),'<br/>';
next($arr);
}
while循环
索引数组遍历
关联数组遍历
<?php
$arr = range(1,10,2); //生成一到十之间的整数,并且他们之间的步长是2
echo '<pre>';
print_r($arr);
echo '</pre>';
$i=0;
while($i<count($arr)) {
echo '第'.($i+1).'个元素是:'.$arr[$i].'<br/>';
$i++;
}
$arr = ['name'=>'peter', 'age'=>28, 'isMarried'=>true];
$i=0;
while ($i<count($arr)) {
echo '第'.key($arr).'个元素是:'.current($arr).'<br/>';
next($arr);
$i++;
}
foreach循环(PHP专门为数组设计的语句)
索引数组遍历
关联数组遍历
<?php
$arr = range(1,10,2);
foreach ($arr as $key=>$value) {
echo '第'.$key.'个数组元素的值是:'.$value.'<br/>';
}
$arr = ['name'=>'peter', 'age'=>28, 'isMarried'=>true];
foreach ($arr as $key=>$value) {
echo '我的'.$key.'是:'.$value.'<br/>';
}
list与each
list语言结构
与echo一样,list是语言结构,并非函数,所以可以放在等号左边
list语句的主要功能是:将数组元素转为变量
1.数组的键名必须是默认从0开始递增的索引数组,不能是关联数组
2.list的参数,不一定要和数组的元素一一对应,不对应的变量就自动忽略
<?php
$arr = range(1, 5);
echo '<pre>';
print_r($arr);
echo '</pre>';
list($a, $b, $c, , $e)=$arr;
echo $a,'==',$b,'==',$c,'==',$e;
each函数
可以遍历任何数组,将当前元素以特殊键值对方式返回,并自动下移数组指针;
0,1是当前元素的键的俩种表示方法,0和1键名对应的是元素索引表示方法,这个特征适合list处理。key和value对应的是元素的关联表示方法。
<?php
$arr = ['合肥', '芜湖', '安庆']; //默认的索引数组
reset($arr); //复位数组内部指针,强制指向第一个元素
echo '<pre>';
print_r(each($arr)); //each()将当前元素以数组的方式返回
print_r(each($arr));
print_r(each($arr));
echo '</pre>';
// 数组说明
// 返回的四个元素的数组
// 0,1是当前元素的键的俩种表示方法,0和1键名对应的是元素索引表示方法,这个特征适合list处理。key和value对应的是元素的关联表示方法。
list-each配合遍历
<?php
$arr = ['name'=>'peter', 'age'=>28, 'isMarried'=>true];
$temp = each($arr); //执行完成,数组指针自动下移
echo '<pre>';
print_r($temp); //索引键名[0]对应的Peter元素的键名,[1]对应peter值
echo '</pre>';
reset($arr); //复位指针,将指针指向第一个数组元素
while(list($key, $value)=each($arr)) {
//$key = 'name',$value = 'peter'
echo '我的'.$key.'是:'.$value.'<br/>';
//$key = 'age',$value = 28
}
遍历方式的选择
默认索引数组用:for
自定义关联数组用:foreach
数组的键值操作函数:
①array_values($arr):
返回数组中的所有元素的值
<?php
/*
array_values():将当前数组元素的值全部取出后重新打包到一个默认索引数组中
默认索引数组:下标从0开始递增的索引数组,其实就是省略掉键名的数组
用在只需要对数组元素的值感兴趣的场合,例如大量数据的搜索等
*/
$arr = ['name'=>'peter', 'age'=>28, 'isMarried'=>true];
echo '<pre>';
print_r($arr);
echo '</pre>';
echo '<hr/>';
$arr1 = array_values($arr);
echo '<pre>';
print_r($arr1);
echo '</pre>';
②array_keys($arr)
:返回数组的键名数组
<?php
/*
array_keys($arr)将当前数组的键取出来,以默认索引数组方式返回
数组的值就是当前数组的键名,非常适合处理关联数数组
*/
$arr = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
$keyArr = array_keys($arr);
echo '<pre>';
print_r($keyArr);
echo '</pre>';
echo '<hr/>';
for($i=0; $i<count($keyArr); $i++) {
echo '我的'.$keyArr[$i].'是'.$arr[$keyArr[$i]].'<br/>';
}
③array_key_exists($key,$array)
:检测键名是否在数组中
<?php
/*
array_key_exists($key,$array)
array_key_exists(键名,数组)
返回值为布尔值,为true则存在,为false则不存在
*/
$arr = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
$key = 'marr'; //定义要查询的键名
//适合于在一个关联数组中查看指定键名是否存在
$res = array_key_exists($key, $arr);
// var_dump($res);
// echo '<hr/>';
if (true == $res) {
echo '键名'.$key.'存在~~~';
} else {
echo '不好意思,该键名'.$key.'不存在,请重新输入~~~';
}
④in_array($value,$array)
:判断某值是否在数组中
<?php
/*
in_array($value,$array,true):判断数组中是否存在某个值
该函数有三个参数,第一个是要查询的值,第二个是目标数组,第三个参数true,是否开启严格模式,如果开启,则值与类型必须完全匹配
字符类型区分大小写
*/
$arr = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
$value = 'peter'; //区分大小写
// $value = 'Peter';
// $value = '28'; //类型为字符串
// $res = in_array($value, $arr);
$res = in_array($value, $arr, true); //true开启严格模式,值与类型完全匹配
var_dump($res);
echo '<hr/>';
if (true == $res) {
echo '值'.$value.'存在~~';
} else {
echo '不好意思,该值'.$value.'不存在,请检查~~';
}
echo '<hr/>';
// 值的类型支持数组
$valueArr = [5,9,12,33];
// $arr1 = ['name'=>'peter', 'age'=>28, 'sex'=>'male', [5,9,12,33]];
$arr1 = ['name'=>'peter', 'age'=>28, 'sex'=>'male', [5,12,33]];
if (in_array($valueArr, $arr1)) {
echo '$valueArr数组存在于数组中~~';
} else {
echo 'sorry,没有找到$valueArr数组~~';
}
echo '<hr/>';
// array_search($value, $array):在数组中搜索给定的值,如果成功则返回首个符合该值的数据相应的键名,支持true参数(严格模式)
$a = ['html','css','php',true];
echo array_search(1, $a);
echo array_search(1, $a, true); //严格模式下找不到,因为严格模式下值与类型需要完全匹配,1是整型,true时布尔类型
数组统计操作:
①count($array)
:返回数组元素数量
<?php
// count($array):获取数组元素数量
$arr = [1,2,3,4,['a','b',[5,6,7]]];
echo '<pre>';
print_r($arr);
echo '</pre>';
echo '$arr数组元素个数是:'.count($arr,0);
echo '<hr/>';
//count($arr,[模式0|1]),0:不检测多维数组,1:检测多维数组;
echo '$arr数组元素个数是(包括多维数组):'.count($arr,1);
②array_count_values($arr)
:返回数组中每个值出现的次数
<?php
/*
统计元素值出现的次数,返回关联数组,键是原数组的值,值是该值出现的次数
要统计的数组元素的值必须是整数或者字符串,否则会抛出警告,因为这些值要被转为新数组的键,而键名必须是整数或字符串
*/
$arr = ['name'=>'peter', 'age'=>28, 'isMarried'=>1, 'num'=>28];
// 要统计的值必须是整数或者字符串
// $arr = ['name'=>'peter', 'age'=>28.2, 'isMarried'=>1, 'num'=>28];
$countArr = array_count_values($arr);
echo '<pre>';
print_r($countArr);
echo '</pre>';
③array_unique(#array)
:删除数组中重复的值
<?php
// array_unique($array):删除数组中重复的值
$arr = ['a'=>'html', 'b'=>'css', 'c'=>'css', 'd'=>'php', 'e'=>'javascript', 'f'=>'php'];
echo '<pre>';
print_r($arr);
echo '</pre>';
echo '$arr数组元素个数是:'.count($arr);
echo '<hr/>';
// 删除重复的元素值,并返回一个新的数组,保留第一个重复元素的键名
$arrNew = array_unique($arr);
echo '<pre>';
print_r($arrNew);
echo '</pre>';
echo '$arrNew数组元素个数是:'.count($arrNew);
用回调函数对数组操作:
①array_filter($array, callback)
:将数组元素一次传入到回调函数这处理
<?php
// array_filter($array. callback):数组过滤器
//将数组中的值,依次逐个传入都回调函数中处理,只有处理结果为true的元素才允许出现在结果数组中
$arr = [1,2,3,4,5,6,7,8,9];
function odd($n) {
return $n & 1; // 按位'与'运算,任何整数与1进行按位与运算之后,只有奇数才会返回1,否则返回0
}
function even($n){
return !($n & 1); //数组中处理奇数,剩下的就是偶数了
}
$arr1 = array_filter($arr, 'odd');
echo '<pre>';
print_r($arr1);
echo '</pre>';
echo '<hr/>';
$arr2 = array_filter($arr, 'even');
echo '<pre>';
print_r($arr2);
echo '</pre>';
echo '<hr/>';
②array_walk($array, callback)
:将数组中的值一次传入callback中处理
<?php
// array_walk(array, funcname)
// 功能:1:遍历数组 2:更新元素
$arr = ['name'=>'peter','age'=>28,'sex'=>'male'];
function printArr($value,$key) {
echo "我的{$key}是{$value}<br/>";
}
array_walk($arr, 'printArr');
// 采用引用传参,可以对数组中的值进行修改
function alterArr(&$value,$key,$suffix){
$value .= $suffix; //给袁术值添加后缀
}
array_walk($arr, 'alterArr', '_php');
echo '<hr/>添加后缀后:<br/>';
array_walk($arr, 'printArr');
// 主要用于影响原数组中的值
③array_map(callback,$array...)
:将回调函数作用在一个或多个数组元素值上
<?php
// array_map(callback,$arr1,$arr2)
// 将回调函数作用到每个数组上,并返回一个新数组:默认索引数组// 回调函数的参数数量,必须与要处理的数组数量一致
//1.将回调函数作用到一个数组上
$arr1 = [1,2,3,4,5];
//在创建一个回调函数
$func1 = function ($value) {
return $value * 2;
};
$newArr1 = array_map($func1, $arr1);
echo '<pre>';
print_r($newArr1);
echo '</pre>';
//2.回调函数作用到多个数组上,以俩个数组为例
$arr2 = ['合肥', '南京', '武汉', '杭州', '上海'];
//创建回调函数,参数数量必须与数组数量一致
$func2 = function ($value1, $value2) {
return "第{$value1}个城市是{$value2}<br/>";
};
$newArr2 = array_map($func2, $arr1, $arr2);
echo '<pre>';
print_r($newArr2);
echo '</pre>';
数组的排序操作:
①sort($array)和rsort($array)
:忽略原键名,按元素值从小到大排序
<?php
// sort($array):元素按值大小从小到大重新排序,根据排序后的顺序,键名重新生成
//rsort($array):元素按值大小从大到小重新排序,根据排序后的顺序,键名重新生成
$arr1 = [23, 53, 32, 2, 56];
$arr2 = ['html', 'css', 'js', 'php', 'mysql'];
echo '排序前<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
// 先对这俩个数组进行正向排序
// sort($arr1);
// sort($arr2);
rsort($arr1);
rsort($arr2);
echo '排序后<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
②ksort($array)和krsort($array)
:按键名正向或反向排序
<?php
// ksort($array):元素按键名大小从小到大重新排序
//rsort($array):元素按键名大小从大到小重新排序
$arr1 = [12=>23, 33=>53, 34=>32, 43=>2,1=> 56];
$arr2 = ['d'=>'html', 'o'=>'ss', 'f'=>'js', 'a'=>'php', 'j'=>'mysql'];
echo '排序前<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
// 先对这俩个数组进行正向排序
sort($arr1);
sort($arr2);
// krsort($arr1);
// krsort($arr2);
echo '排序后<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
③asort($array)和arsort($array)
:保留原键名正向或反向排序
<?php
// asort($array):保留原数组的键值对应关系,元素按键名大小从小到大重新排序
//asort($array):保留原数组的键值对应关系,元素按键名大小从大到小重新排序
$arr1 = [12=>23, 33=>53, 34=>32, 43=>2,1=> 56];
$arr2 = ['d'=>'html', 'o'=>'css', 'f'=>'js', 'a'=>'php', 'j'=>'mysql'];
echo '排序前<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
// 先对这俩个数组进行正向排序
asort($arr1);
arsort($arr2);
echo '排序后<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
sort($arr1);
rsort($arr2);
// krsort($arr1);
// krsort($arr2);
echo '排序后<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
④array_multisort($arr1,$arr2,$arr3...)
:同时对多个数组或多维数组进行排序
<?php
/*array_multisort($arr1,$arr2,$arr3...):同时对多个数组或多维数组进行排序,属于破坏性排序
排序标志:SORT_ASC升序,SORT_DESC降序
1.先创建俩个索引数组,同时对他们进行排序*/
$arr1 = [1,2,3,4,5];
$arr2 = [5,4,3,2,1];
echo '排序之前:<br/>';
echo '<pre/>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
array_multisort($arr1,SORT_DESC, $arr2,SORT_ASC);
echo '排序之后:<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
// 对多维数组进行排序
$arr = [
0=>['name'=>'peter', 'age'=>28],
1=>['name'=>'jack','age'=>23],
2=>['name'=>'tom', 'age'=>30],
3=>['name'=>'mike', 'age'=>49]
];
// echo '排序之前的二维数组:<br/>';
// echo '<pre>';
// print_r($arr);
// echo '</pre>';
// 按数组中的每个键值,生成一个新的数组,现在每个子数组中有俩个键值对,所以需要生成俩个数组
foreach ($arr as $key => $value) {
$name[$key] = $value['name'];//生成新数组$name
$age[$key] = $value['age'];//生成新数组$age
}
// echo '查看新生成的数组:<br/>';
// echo '<pre>';
// print_r($name);
// print_r($age);
// echo '</pre>';
array_multisort($name,SORT_ASC,$age,SORT_DESC,$arr);
echo '排序完成以后的数组:<br/>';
echo '<pre>';
print_r($arr);
echo '</pre>';
用数组实现数据结构中的堆栈与队列操作:
①array_push和array_pop()
实现堆栈操作(先进后出)
<?php
// array_push():入栈,返回值是数组的当前长度
// array_pop():出栈,返回当前弹出的元素值
$arr = ['name'=>'peter', 'age'=>28];
echo '1.当前数组的长度是:'.array_push($arr,'合肥');
echo '<pre>';
print_r($arr);//入栈的元素,总是数字索引
echo '<pre>';
echo '2.当前数组的长度是:'.array_push($arr,[100, 200]);
echo '<pre>';
print_r($arr);//入栈的元素,总是数字索引
echo '<pre>';
echo '2.当前数组的长度是:'.array_push($arr,'php.cn','php中文网');
echo '<pre>';
print_r($arr);//入栈的元素,总是数字索引
echo '<pre>';
echo '当前出栈的元素是:'.array_pop($arr).'<br/>';
echo '当前出栈的元素是:'.array_pop($arr).'<br/>';
echo '当前出栈的元素是:'.'<br/>';
print_r(array_pop($arr));
②array_shift()和array_unshift()
实现队列操作(后进后出)
<?php
//队列:后进先出,最后添加的数据,最先出队
//入队:数组头部:array_unshift(),数对:array_shift()
$arr = ['name'=>'peter','age'=>28,'sex'=>'male'];
echo '出队元素是:'.array_shift($arr).'<br/>';
echo '出队元素是:'.array_shift($arr).'<br/>';
echo '出队元素是:'.array_shift($arr).'<br/>';
echo '当前数组长度:'.count($arr);
// 从尾部入队:添加元素array_push()
array_push($arr,'php','mysql');
echo '<pre>';
print_r($arr);
echo '</pre>';
//从头部的入队操作
array_unshift($arr,'html','css');
echo '<pre>';
print_r($arr);
echo '</pre>';
其他数组处理函数:
①array_rand($array,$n)
:从数组中取出一个或者多个元素的键名返回
②shuffle($array)
:将数组乱序输出,原有键名全部删除,按默认索引重新排序
③array_sum($arr)
:计算数组元素的值的总和
④range($start,$end,$step)
:按步长生成指定范围数组
<?php
// array_rand():从数组中随机取出一个或多个元素的键名
$arr = ['合肥','南京','武汉','杭州','上海'];
// echo array_rand($arr);//随机取出一个元素的键名
$keyArr = array_rand($arr, 2);
echo '<hr/>';
//根据随机取到的键名,阿里随机取出数组
if(count($keyArr)>0){
foreach ($keyArr as $key=>$value){
echo '第'.($key+1).'次随机取出的元素是:'.($key+1).'=>'.$arr[$value].'<br>';
}
}
//shuffle()将数组乱序输出,原有键名全部删除,按默认索引重新排序
返回布尔值,1:表示成功;0:表示失败
$arr = ['hf'=>'合肥','js'=>'南京','wh'=>'武汉','上海','杭州'];
echo '<pre>';
print_r($arr);
echo '</pre>';
echo '<pre>';
if (shuffle($arr)) {
echo '数组打乱后,新数组如下:<br/>';
print_r($arr);
} else {
echo '数组打乱失败';
}
echo '</pre>';
//array_sum(array):求数组元素的和
echo array_sum([13,22,80]);
echo array_sum(['18',22,80]);
120
echo array_sum(['php','22php',80]);
102
echo '<pre>';
print_r(range(1,10));
print_r(range(1,10,2));
echo '</pre>';