0x01 数组的创建
php数组按类型分有:索引数组和关联数组;按维度分有:一维数组,二维数组,三维数组,...,n维数组(一般到三维数组就停止了,因为更高维的数组对计算机的计算性能要求较高,会导致运行速度下降,简单来说就是处理不过来)
下面是各类数组的创建方式:
// 数组的创建(索引数组) // 1. 使用内置函数 $arr = array('小明','小红','小花'); // 2. 使用[]简写 // 如果两个数组的名字一样,后定义的数组会覆盖先定义的数组 // 某些老版本不支持这种创建方法 $arr = ['小蓝','小绿','小兰']; // 关联数组,使用=>标识变量名和值的关联关系。注意=>与变量名和值之间不能有空格,否则会报错 $arr2 = ['name'=>'小明','age'=>18,'gender'=>'male']; // 关联数组和索引数组可以混编 $arr3 = ['php'=>'世界上最好的编程语言','千里行走','10'=>'外婆桥','童话镇']; //print_r($arr3); // 二维数组 $arr4 = [ ['name'=>'小明','id'=>1], ['name'=>'肖华','id'=>20], '学员' ]; //print_r($arr4); $arr5 = [ 'name'=>'小明', 'name'=>'肖华', ['name'=>'怪盗基德', 'desc'=>'magician' ] ]; //三维数组 $arr6 = [ ['name'=>'小明', 'id'=>1, ['job'=>'student','age'=>12] ], ['name'=>'肖华', 'id'=>20, ['job'=>'student','age'=>16] ], [ 'desc'=>['job'=>'magician','age'=>18], 'name'=>'怪盗基德', 'id'=>20 ] ]; //print_r($arr6);
0x02 打印数据
在php中有三种打印数据的方法:echo、print_r、var_dump
以下是这三种方式的使用方法及特点(注:下面出现的数组均在0x01中定义):
// echo只能打印普通类型的数据,直接打印整个数组时会报错 // echo $arr;会报错 echo $arr[1]."<br>"; echo $arr2['gender']."<br>"; // 打印数据,包括数组。但打印数组时会带有array(),所以不能用于前端展示 print_r($arr); // 打印数据以及数据的数据类型;对于数组和字符串而言,会显示长度。其余显示值大小 var_dump($arr2);
0x03 遍历数组
在php中有两种遍历数组的方式:
1. 使用for循环: 这种方法只适用于遍历索引数组。需要配合count()使用,count()是计算数组长度的内置函数;在php中更常用foreach来遍历数组(注:下面出现的数组均在0x01中定义)
//遍历数组 //遍历一维数组 //1. 使用for循环 // 这种方法只适用于遍历索引数组;在php中更常用foreach来遍历数组 //count()计算数组长度的内置函数 for($i = 0; $i < count($arr); $i++){ echo $arr[$i].' '; } echo '<hr>';
2. 使用foreach遍历,下面是对foreach参数的解释:
$arr是需要遍历的数组的名称
as是关键字
$k是键,也就是下标;$v是值
$arr as $k => $v表示每次循环取出当前键值对赋给$k和$v,他们相当于临时变量,每次循环都会改变值
$arr、as、$v是必需的,$k可以省略
(注:下面出现的数组均在0x01中定义)
//2. 使用foreach遍历 // 一维数组遍历 //索引数组 foreach($arr as $k => $v){ //$arr是需要遍历的数组的名称 //as是关键字 //$k是键,也就是下标;$v是值 //$arr as $k => $v表示每次循环取出当前键值对赋给$k和$v,他们相当于临时变量,每次循环都会改变值 //$arr、as、$v是必需的,$k可以省略 echo $k .'-'. $v.' '; } echo '<hr>'; //关联数组 foreach($arr2 as $k=>$v){ echo $k.'-'.$v.' '; } echo '<hr>'; //混编数组,注意:当混编数组中的某个元素为数组时,不能使用echo打印 foreach($arr3 as $k=>$v){ echo $k.'-'.$v.' '; }
对于二维及以上的数组:
分两种情况:1. 所有数组元素的格式一致:如果所有元素都是数组,则使用两重foreach循环即可
2. 数组元素是数组和普通数据类型混杂,则要先判断数组元素是不是数组
下面讨论第二种情况(注:下面出现的数组均在0x01中定义):
//二维数组 //分两种情况:1. 所有数组元素的格式一致:如果所有元素都是数组,则使用两重foreach循环即可 // 2. 数组元素是数组和普通数据类型混杂,则要先判断数组元素是不是数组 //下面讨论第二种情况 //遍历二维数组 foreach($arr4 as $k=>$v){ //使用if-else判断来对数组元素的类型进行判断 //is_array()是php的内置函数,用于判断参数是不是数组 //当if的条件为真时,执行if后面的语句;当if的条件为假时,执行else后面的语句 if(is_array($v)){ foreach($v as $kk=>$vv){ echo $kk.'-'.$vv.' '; } echo '<br>'; }else{ echo $k.'-'.$v.' '; } } echo '<hr>'; //下面是取某个特定数据的方法 //假如我要打印拥有desc属性的数组的值 //1. 知道只有拥有desc属性的元素是数组 foreach($arr5 as $k=>$v){ if(is_array($v)){ foreach($v as $kk=>$vv){ echo $vv.'<br>'; } } } echo '<hr>'; //2. 只知道数组的维度 foreach($arr5 as $k=>$v){ //isset()也是内置函数,可以判断参数是否被声明 if(isset($v['desc'])){ foreach($v as $kk=>$vv){ echo $vv.'<br>'; } } } echo '<hr>'; // 三维数组循环 // 其实无论多少维循环,代码都是类似的,关键在于if语句对数组元素类型的判断以及foreach对当前维度数据的遍历。还有就是每层循环的临时参数不能同名,否则会导致值覆盖 foreach($arr6 as $k=>$v){ if(is_array($v)){ foreach($v as $kk=>$vv){ if(is_array($vv)){ foreach($vv as $kkk=>$vvv){ echo $vvv.' '; } }else{ echo $vv.' '; } } }else{ echo $v.' '; } echo '<br>'; }
0x04 总结
1. 数组创建有两种方式:使用内置函数或者使用[]简写;
2. 数组分为索引数组和关联数组:索引数组以数字为下标,从0开始,可以不指定键的值;关联数组,使用=>标识变量名和值的关联关系。注意=>与变量名和值之间不能有空格,否则会报错,他所使用的下标可以是英文也可以是数字。
3. 当使用二维或多为数组时,一般使用外层索引数组,内层关联数组的形式,方便前端接收处理