PHP数组总结

原创 2018-11-21 20:22:05 911
摘要:    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);
}

1.png2.png

    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
老师总结:现在可以批改了吧!很不错!写了这么多!很完整!点个赞!!!

发布手记

热门词条