摘要: ps:好久没写总结了 看来是篇长总结了一.PHP中的数组基础知识 * 数组的分类:索引数组,关联数组; * 数组的定义:整体或逐个赋值; * 数组元素的类型:字面量[标量,复合,其他],变
ps:好久没写总结了 看来是篇长总结了
一.PHP中的数组基础知识
* 数组的分类:索引数组,关联数组;
* 数组的定义:整体或逐个赋值;
* 数组元素的类型:字面量[标量,复合,其他],变量
* 数组的遍历:for(),while(),foreach(),内部指针
+ array_values($arr) :返回元素的值组成的新数组
+ array_column($arr,$col,$index):返回多维数组中的一列
+ array_keys($arr,$val,$bool):返回元素的键名组成的新数组
+ in_array($val,$arr,$bool):判断元素中是否存在某个值
+ array_search($val,$arr,$bool):查找指定值,并返回该值的键名
+ array_key_exists($key,$arr):判断数组中是否存在指定的键名
+ array_flip($arr):键值对调
+ array_reverse($arr):数组翻转(第一个元素变成最后一个,最后一个编程第一个,以此类推)
* print_r($arr,$bool):格式化的输出变量,数组
* var_dump($arr1,$arr2.....):输出一个或者多个变量的详细信息
* var_export($arr,bool):输出变量的字符串表示,其实就是php语句
------------------------------------------------------------------------------------------------------------------
//索引数组
//用字面量的形式进行创建(将值直接写在数组里)
$arts = ['英语','数学','语文','物理','化学','体育'];
//关联数组 键名是有意义的值
$swordsman = ['name'=>'郭靖','position'=>'金刀驸马','skill'=>'德智体美劳'];
//for()
$res = '';
for ($i = 0;$i<count($arts);$i++){
$res .= $arts[$i].',';
}
echo $res.'<hr>'; // 输出'英语','数学','语文','物理','化学','体育',
echo rtrim($res,',').'<hr>'; //rtrim(字符串,符号) 取出最右边的符号或者空格
$res2 = '';
$i = 0;
while ($i<count($arts)){
$res2 .= $arts[$i].'---';
$i++;
}
echo rtrim($res2,'---').'<hr>'; //同理
//foreach() 专门用来循环遍历数组的
foreach ($swordsman as $key=>$val){
echo $key,'=>',$val,'<br>';
} 用内部指针来进行遍历 (引用赋值,会改变原数组)
current()当前指针指向的元素的值
key() 当前指针指向的元素的键名
next(),下移指针 prev()前移指针
end() 将指针移到最后的一个元素上
reset()指针复位,指向第一个元素
reset($arts); //获取第一个元素的键名和值 echo key($arts),'-----',current($arts).'<br>'; //获取第二个元素 next($arts); echo key($arts),'-----',current($arts).'<br>'; next($arts); echo key($arts),'-----',current($arts).'<br>'; //后退一步 prev($arts); echo key($arts),'-----',current($arts).'<br>'; //最后一个 end($arts); echo key($arts),'-----',current($arts).'<br>'; //返回第一个 reset($arts); echo key($arts),'-----',current($arts).'<br>';
foreach遍历关联数组 ps:这地方朱老师有个小疏忽 视频中是拿索引数组做的例子 无伤大雅
reset($swordsman);
for ($i = 0;$i<count($swordsman);$i++){
echo key($swordsman),'----->',current($swordsman).'<br>';
next($swordsman);
}

while()入口判断型,会导致第一个元素的缺失,所以需要用出口判断
while (next($swordsman)){
echo key($swordsman),'----->',current($swordsman).'<br>';
}
reset($swordsman);
echo "<br>";
do{
echo key($swordsman),'----->',current($swordsman).'<br>';
} while (next($swordsman)); array_values($arr) //只取值
$arr1 = ['id'=>10,'name'=>'托尼-斯塔克','sex'=>'man','salary'=>100000]; echo '<pre>',var_export(array_values($arr1),true).'<hr>';
array_column($arr,$col,$bool):获取多维数组的列组成的数组
$arr2[] = ['id'=>10,'name'=>'托尼-斯塔克','sex'=>'男','salary'=>100000]; $arr2[] = ['id'=>11,'name'=>'绿巨人','sex'=>'男/怪物','salary'=>800]; $arr2[] = ['id'=>12,'name'=>'托尔','sex'=>'神','salary'=>5000]; echo '<pre>'.var_export(array_column($arr2,'sex'),true),'<hr>'; //输出多维数组键为sex的值所做成的新数组
array_keys($arr);返回当前数组的键名组成的新数组
echo '<pre>'.var_export(array_keys($arr1,'man'),true),'<hr>'; //返回指定的值所对应的键名(不指定就返回所有键)
in_array() 判断指定值是否存在指定数组中 返回布尔值
echo in_array('托尼-斯塔克',$arr1) ? '存在' : '不存在'; array_search($val,$arr):在$arr中查询$val, 并返回$val对应键名
$res = array_search('托尼-斯塔克',$arr1);
echo $res ? : '没有找到' ,'<hr>';
echo $arr1[$res].'<br>'; array_key_exists($key,$arr) 判断键名是否存在指定数组
echo array_key_exists('name',$arr1) ? '键名存在' : '键名不存在'; array_flip($arr)键值互换
echo '<pre>',var_export(array_flip($arr1),true).'<br>';
array_reverse($arr)数组翻转
echo '<pre>',var_export(array_reverse($arr1),true).'<br>';
---------------------------------------------------------------------------------------------------------------
二.数组与变量和字符串之间的转换
+ list($var1,$var2):将数组中的索引元素转为变量
+ extract($arr,$flag): 将数组中的关联元素转为变量
+ compact($str1,$str2...):将变量转为关联数组(与extract()功能相反)
+ explode($delimiter,$str,$limit):将字符串转换为数组
+ implode($glue,$arr):将数组转为字符串
1.list($var1,$var2...) 将数组中的索引数组 转成指定的变量
list($super,$green,$shank) = ['超人','绿巨人','雷神']; //$super = '超人';$green = '绿巨人';$shank = '雷神';
2.extract($arr,$flag) 将关联数组的值转为变量(生成的变量为$键名=值) 返回生成变量的数量
$arr1 = ['id'=>10,'name'=>'托尼-斯塔克','sex'=>'man','salary'=>100000]; echo extract($arr1); //4
3.compact($str,$str1...)将变量转为关联数组 返回新数组 传入变量名的字符串
$name = '黑寡妇';
$sex = '女';
$faction = '神盾局';
$arr2 = compact('name','sex','faction');
//['name'=>'黑寡妇','sex'=>'女','faction'=>'神盾局'];4.explode()将字符串转为数组 参数1:分割依据 参数2 目标字符串 参数3 正数限制输出几个数组元素 最后一个保存剩余字符串 负数为从后面删除限制个数
$lang = 'html,css,javascript,jquery,php,mysql';
echo '<pre>',var_export(explode(',',$lang),true).'<hr>';
//限制一下转换的数组元素的数量
echo '<pre>',var_export(explode(',',$lang,4),true).'<hr>';//最后一个元素保存剩余字符串
//limit为负数,负数就是要删除的元素的个数
echo '<pre>',var_export(explode(',',$lang,-2),true).'<hr>'; //输出数组一个4个元素5.implode($glue,$arr):将数组转为字符串 参数1 为每个数组元素合并成字符串的间隔 参数2位目标数组
$arr = ['首页','公司新闻','公司项目','联系我们'];
//添加<a>标签,转为导航
echo var_export(
'<a href="#">'.implode('</a>|<a href="#">',$arr).'</a>',
true).'<hr>';三.数组的切割与填充
+ array_slice($arr,$offset,$length,$bool)从数组中返回指定的元素
+ array_splice(&$arr,$offset,$length): 从数组中删除或替换指定元素 (引用元素,更改原数组)
+ array_chunk($arr,$size,$bool)将大数组切割成若干个小数组
+ array_pad($arr,$size,$value):将数组填充到指定的长度
1.array_slice($arr,$offset,$size,$bool)从数组中返回指定的元素 长度可以为负值
$arr = [10,20,30,40,50,60]; echo '<pre>'.var_export(array_slice($arr,2,3),true).'<hr>'; //30,40,50返回指定位置 指定个数的数据 //保留结果中的键值对应关系,保留键名 echo '<pre>'.var_export(array_slice($arr,2,-2,true),true).'<hr>'; //30,40,50
2.array_splice(&$arr,$offset,$size)返回被移除的元素 从数组中删除或替换指定元素
$arr = [10,20,30,40,50,60]; echo '被移除的元素是:'.var_export(array_splice($arr,2,1,'php'),true).'<hr>'; //参数1指定数组 参数2起始索引 参数3 指定数量 参数4替换元素 echo '原始数组:'.'<pre>'.var_export($arr,true).'<br>';
3.array_chunk();将大数组分拆成指定大小的小数组 参数1 指定数组 参数2 每组新数组个数 ,参数3true 保留键名
$arr1 = range(1,20); print_r($arr1); echo '<pre>'.var_export(array_chunk($arr1,3,true),true).'<hr>';
4.array_pad($arr,$size,$value) 填充数组到指定长度 参数1:目标数组 参数2:要填充到多少(可以负数从后往前数填充) 参数3:填充内容
$arr = [50,60,70]; echo '<pre>'.var_export(array_pad($arr,7,99),true).'<hr>'; echo '<pre>'.var_export(array_pad($arr,7,[88,99]),true).'<hr>'; echo '<pre>'.var_export(array_pad($arr,-8,'php'),true).'<hr>';
四.用数组实现堆栈与队列
+ 数组其实就是一张线性表,堆栈是后进先出的线性表,而队列是先进先出的线性表 都是引用 更改原数组
+ array_push($arr,$value):从数组尾部添加(入栈/入队)
+ array_pop($arr): 从数组尾部删除元素(出栈/出队)
+ array_unshift($arr,$value):从数组头部添加(入栈/入队)
+ array_shift($arr):从数组头部删除元素(出栈/出队)
1.堆栈操作 array_push()入栈 返回添加的数量 array_pop()出栈
$arr = []; echo '入栈操作',array_push($arr,'钢铁侠'),'个元素<br>'; //返回添加的数量 echo '出栈元素'.var_export(array_pop($arr),true).'<br>'; // 返回出栈元素
2.头部进行增删操作 队列操作
2.1头部添加 array_unshift() 返回添加元素数量
echo '添加了'.array_unshift($arr,'宋江').'个元素<hr>';
2.2从 头部删除 array_shift() 返回被删除的元素
echo '被删除的是:'.array_shift($arr).'<hr>';
队列:先进先出 从尾部进入,从尾部添加
array_push($arr,'林冲'); echo '当前数组'.var_export($arr,true).'<br>';
从头部出队:
array_shift($arr); echo '当前数组'.var_export($arr,true).'<br>';
五.数组元素的回调处理
+ 匿名函数最重要的用途,就是作为回调参数的值来使用,所以数组的回调处理函数中会大量的用到匿名函数,其实就是闭包
* array_filter($arr,$callback);用回调过滤数组元素
* array_walk(&$arr,$callback,$var):遍历元素并回调处理
array_filter($arr,$callback) 参数$arr: 要过滤的数组 参数$callback :回调
$arr1 = [0,213,'','天啊',null,false,'jq'];
$arr2 = array_filter($arr1); //不传入回调 便是过滤掉数组中值为false的元素 (null,0,false,'')都算
$arr4 = array_filter($arr1,function ($value){ //传入回调会将数组中的每一个值传入到匿名函数中进行处理
//如果值等于css,就把css过滤掉
return ($value !== '天啊'); //把值为'天啊'的元素过滤掉
}); array_walk(&$arr,$callback,$var) 参数$arr:要遍历的数组引用传参 会改变原来数组的值 参数$callback 参数$var 自定义参数
$arr = ['name'=>'peter','email'=>'admin@php.cn'];
array_walk($arr,function(&$value,$key){
echo $key,'::',$value,'<br>';
});
//传入第三个自定义参数,实现更加强大的功能
array_walk($arr,function(&$val,$key,$name){
//如果想查看的用户名是admin,直接拒绝
if($val == $name){ //如果值等于自定义参数$name ('admin') 则输出无权查看
exit('无权查看超级管理员信息');
}else{
echo $key,':',$val,'<br>';
}
},'admin');六.数组的排序操作
+ 数组元素主要是由键名和值二部分组成,所以排序主体就是键名和值,顺序只有升序和降序二种 (引用赋值,修改原数组)
+ 根据值排序
* 忽略键名: sort()升序,rsort 降序,usort()回调
* 保留键名: asort()升序 arsort 降序 uasort回调
+ 根据键名排序: ksort()升序,krsort()降序,uksort()回调
1.根据数组的值进行排序
1.1忽略键名,主要针对索引数组(引用转递,会改变原数组)
升序 sort() 并忽略键名
$arr = [1,5,345,7567,235,78,2,45568,4234,'a1','b','1a',0]; sort($arr);
降序 rsort() 并忽略键名
$arr = [1,5,345,7567,235,78,2,45568,4234,'a1','b','1a',0]; rsort($arr);
回调usort()并忽略键名
$stu = [
['name'=>'钢铁侠','grade'=>98],
['name'=>'蜘蛛侠','grade'=>65],
['name'=>'蝙蝠侠','grade'=>90]
];
//用户自定义回调来排序
usort($stu,function ($m,$n){
return strcmp($m['grade'],$n['grade']); //比较字符串 按照成绩升序排序并忽略键名
});
//输出排序后的数组
echo '<pre>'.var_export($stu,true).'<br>';
//usort()更适合二维数组排序,对每个元素用回调进行处理 1.2.保留键名,主要针对关联数组(引用转递,会改变原数组)
asort()升序,arsort()降序,uasort()回调 方法几乎和忽略键名的操作一样
$price = ['沈阳'=>10000,'深圳'=>30000,'南京'=>22000,'武汉'=>12000];
asort($price);
arsort($price);
$stu = [
['name'=>'钢铁侠','grade'=>98],
['name'=>'蜘蛛侠','grade'=>65],
['name'=>'蝙蝠侠','grade'=>90]
];
uasort($stu,function ($m,$n){
return strcmp($m['grade'],$n['grade']); //比较字符串 按照成绩升序排序 依旧适合二维数组
});
echo '<pre>'.var_export($stu,true).'<br>'; 2. 根据键名进行排序
ksort()按键名升序, krsort()按键名降序,uksort()用自定义的回调对键名进行排序
$lang = ['html'=>'超文本标记语言','css'=>'样式表','javascript'=>'前端脚本','php'=>'后端脚本'];
ksort($lang); //升序
krsort($lang); //降序
//用自定义的回调对键名进行排序
uksort($lang,function ($m,$n){
// $a = substr($m,1,1); //截取字符串 从索引为1的开始 截取1个 也就是从第二个开始进行排序
// $b = substr($n,1,1);
// return strcmp($a,$b);
return strcmp($m,$n); //直接升序
});七.其他常用数组函数
+ range($start,$end,$step);生成指定范围与步长的数组
+ array_unique($arr):删除数组中值重复的元素(键名不存在重复的)
+ array_fill($arr,$value):用指定元素初始化一个数组
+ array_rand($arr,$size):从数组中随机取出部分元素
+ shuffle($arr):将数组元素随机打乱显示
+ array_merge($arr1,$arr2):将多个数组进行合并,键名相同则覆盖
1.range()生成指定范围指定步长的数组
$arr = range(5,20,5);
2.array_unique():去掉数组中重复的值
$arr = [4,10,10,123,536,2137,214,333,234,333]; echo '<pre>'.var_export(array_unique($arr),true),'<hr>';
3.array_fill():填充数组 array_fill(起始索引,元素数量,填充值);
$arr = array_fill(0,10,0); //生成一个10个元素的数组,并用0进行初始化
4.array_rand():从数组中随机取出一些数据 返回的是随机数的键名组成的数组,并不是值
$arr = [2,14,19,123,6,45678,21,48,67,891,234,47456,1,34,'a'];
$keys = array_rand($arr,3);
print_r($keys); //返回3个随机数组的键名组成的数组
foreach($keys as $key=>$value){
// $res[$value] = $arr[$value]; //保留键名
$res[] = $arr[$value]; //不保留键名
} 5.shuffle():将数组的顺序随机打乱 并且修改原数组 引用传参 非常适合验证码
$arr1 = ['赵云','吕布','董卓','貂蝉']; shuffle($arr1); echo '<pre>'.var_export($arr1,true),'<hr>';
6.array_merge()合并多个数组,同一键名会自动覆盖,并返回一个新数组,适合于参数配置
$db_sys = ['host'=>'127,0,0,1','user'=>'root','pass'=>'root']; $db_user = ['host'=>'localhost','pass'=>'123456']; $res = array_merge($db_sys,$db_user); echo '<pre>'.var_export($res,true),'<hr>';
数组相关总结还是好多的 看来需要多练习一下了
批改老师:韦小宝批改时间:2018-11-22 09:07:54
老师总结:现在可以批改了吧!很不错!写了这么多!很完整!点个赞!!!