第一部分 数组简介
定义:数组是PHP中重要的数据类型之一,属于复合类型(可以保存多个值),实际上是一个有序的映射(键值关联键名)。
分类:
1.索引数组:数组的下标是数字。
2.关联数组:数组的下标为字符。
注意:PHP中数组其实是不区分索引还是关联数组,都是根据键名找到对应的键值的。
第二部分 数组创建
定义数组:
1.通过array()形式创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
<span style="color: #000000;"><?php //空数组 $arr = array(); //检测是否是数组 var_dump($arr); var_dump(is_array($arr)); //通过array()定义下标连续的索引数组 $arr = array(1,2.3,'Bing'); print_r($arr); //手动指定下标 $arr=array( 3=>'a', 5=>'b', 6=>'b' ); print_r($arr); /* Array ( [3] => a [5] => b [6] => c ) */ // 定义关联数组 $userInfo = aaray( 'username' => 'bing', 'age'=>12, 'email'=>'2132@qq.com', 'salary'=>60000 ); print_r($userInfo ); //定义混合数组(既有索引又有关联的数组) $arr = array( 'a','b','c', 'username' => 'imooc', 5 => 'd'; -12 => 'e' ); print_r($arr); //测试数组键名 echo '<pre>'; $arr = array( 3=>'a', 'username'=>'bing', '5.6' => 'b', //5舍掉小数部分取整数 true => 'c', //1 false => 'd',//0 ''=>'e', null => e ); print_r($arr); echo '</pre>'; //$arr = array( 'a','b','c' 5 =>'d', 19 =>'e', 'f' //这个时候下标是20 ); var_dump($arr); // PHP 5.4之后的新方法 $arr = ['a','b','c']; print_r($arr); </span> |
小结:
- array()空数组
- array(值,…) 下标连续的索引数组,下标从0开始
- array(键名=>键值) 指定下标的索引数组、关联数组、混合数组。
- 通过[]的形式定义数组,代替array()
注意:
- 除了数组和对象和对象不能作为键名其他的都可以,true是1,flase是2,null是空字符串。
- 检测是否为数组可以通过:var_dump()、gettype(),is_array()
- 数组键名可以使用合法的数字字符串,浮点数会舍掉小数部分,取整为键名。
- 如果下标重复了,后面的会覆盖前面的值。
- 如果新添加的元素没有指定下标,那么他的下标从已有的下标的最大值加1(已有下标不全为负数的情况)。如果是之前的下标全是负数,那么就会从0开始。
- <?php $arr = [‘a’,’b’,’c’]; print_r($arr);
通过array()创建多维数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<?php $arr = array('a'); print_r($arr); $arr = array( array('a','b','c'), array('e','f') ); print_r($arr); //二维索引+关联数组 $arr = array( array( 'id' => 1, 'username' => 'bing' ), array( 'id' => 2, 'username' => 'queen' ) ); print_r($arr); // 二维关联+索引 $arr = array( 'username' => array('bing1','bing2'), 'ages' => array(12,34,56); ); print_r($arr); //二维关联+关联 $arr = array( 'userInfo' => array( 'id'=>1, 'username'=>'bing' ), 'courseInfo' => array( 'cid' => 1, 'couseName' => 'PHP' ); print_r($arr); //索引+关联 $arr =[ [id=>'1','username'=>'bing'], [id=>'2','username'=>'bing'], [id=>'3','username'=>'bing'], [id=>'4','username'=>'bing'], ]; //关联+关联 $arr=[ 'couses'=>['cousename'=>'php','course'=>'php'], 'test'=>['cousename'=>'php','course'=>'php'], ]; |
注意:
- 二维中最重要的形式是二维索引+关联的形式(因为数据苦衷查询出的记录就是这种形式),
- 另外二维的关联+关联也很重要
2.通过[ ]动态创建
有几种形式创建
- $数组名称[]=值 下标连续的数组
- $数组名称[键名]=值 指定下标的索引数组和关联数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<span style="color: #000000;"><?php echo '<pre>' //动态创建下标连续的索引数组 $arr1[] = 12; $arr1[] = 1243.213; $arr1[] = true; print_r($arr1); //手动指定下标的索引数组 $arr2[3]=45; $arr2[-56]=-12; $arr2[0]='this is bing'; print_r($arr2); //动态创建关联数组 $sesc ='this is a test'; $username['username'] = 'bing'; $username['age']=12; $username['sesc']=$sesc; $username[12]='as'; //二维的索引+关联 $arr3[] = ['id' =>1 ,'username'=>'king','age'=>12]; $arr3[] = ['id' =>2 ,'username'=>'king','age'=>12]; $arr3[] = ['id' =>3 ,'username'=>'king','age'=>12]; $arr3[] = ['id' =>4 ,'username'=>'king','age'=>12]; print_r($arr3); //二维关联+关联 $arr4['course'] = ['cousename'=>'php','course'=>'php']; print_r($arr4); //多维的数组 $arr5[][][][][]=1 echo '<pre/>'</span> |
3.通过range()和compact()创建
range(起始点,结束点,步长)快速创建下标连续的索引数组
compact快速穿件关联数组
注意:compact里面只写变量的名字不写$符号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<span style="color: #000000;"><?php $arr = range(1,10); print_r($arr); $arr = range(-10,5); print_r($arr); // 手动指定步长 $arr = range(1,10,2); print_r(); echo '<hr/>'; $arr = range('a','z') //97-122 print_r($arr); for($i=97;$i<=122;$i++){ $arr1[] = char($i); } print_r($arr1); echo '<hr/>'; // 快速创建关联数组 $username = 'bing'; $age = 12; $email = '823912@qq.com'; $userInfo = array( 'username' => $username, 'age' => $age, 'email' => $email ); print_r($userInfo); //动态创建数组 $userInfo2['username'] = $username; $userInfo2['email']=$email; $userInfo2['age']=$age; print_r($userInfo2); // 快速创建!!! // 注意通过compact创建数组的时候只能写已存在变量的名称,不需要添加$符号 $userInfo3 = compact('username','age','email'); print_r($userInfo3); </span> |
4.通过define()定义常量数组(PHP7中新增)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<span style="color: #000000;"><?php // 定义常量数组 //const 在5.6之后可以定义常量 const ARR1 = array('a','b','c'); print_r(ARR1); const ARR2 = [ 'a' => aa, 'b' => bb ] //通过define定义常量数组 define('TEST1',array('a','b','c')); print_r(TEST1); define('TEST2',['d','e','f']); print_r(TEST2); //定义错误信息的数组 define('CUSTOM_UPLOAD_ERRORS,[ 'ext_error' => '文件扩展名不符合规范' 'maxsize_error' => '上传文件大小不符合规范' ]); print_r(CUSTOM_UPLOAD_ERRORS); echo '<hr/>'; echo CUSTOM_UPLOAD_ERRORS['ext_error']; </span> |
第三部分 数组转换
使用数组的原则:通过键名找键值
注:使用{}和[]都可以
查找操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<span style="color: #000000;"><?php //数组使用 $arr = ['a','b','c','d']; print_r($arr); echo $arr[2]; //取出c echo '<br/>'; $res = $arr[0];//赋值给变量 echo $res; $arr = [ 'username'=>'king', 'age' => 12, 'email' =>'123@pnw.edu' ]; echo $arr['username'];</span> |
增加操作:
1 2 3 4 5 6 7 8 9 10 11 12 |
<span style="color: #000000;"><?php //向数组中添加元素 $arr =['a','b','c']; $arr[]='d'; $arr['test']='test'; print_r($arr);//这个时候d没有指定下标,所以下标是已有下标的最大值+1 //更新操作 $arr['a'] = 'new';//其实就是覆盖之前的值 //对于二维数组也是一样的</span> |
二维数组的增删改查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php $courses[]=['id'=>1,'courseName'=>'php','courseDesc'=>'PHP是最好的语言']; $courses[]=['id'=>2,'courseName'=>'javascript','courseDesc'=>'javascript是最好的语言']; $courses[]=['id'=>3,'courseName'=>'go','courseDesc'=>'go是最好的语言']; print_r($courses); echo $courses[0]['courseName'],'--',$courses[0]['courseDesc'],'<br/>'; $courses[1]['courseName']='js'; echo $courses[1]['courseName'],'<br/>'; unset($courses[2]['courseName']); print_r($courses); unset($courses[1]); print_r($courses); echo '<hr/>'; function test(){ return ['a','b','c']; } $res=test(); echo $res[1]; echo '<br/>'; echo test()[1]; |
其他类型转换为数组规则:
- 如果将一个值转换为数组,将得到一个仅有一个元素的数组其下标为0。该元素即为此标量的值。
- 对象可以转换为数组,但是注意尽量避免这样的转换,因为会导致一些意想不到的效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php //其它类型转换成数组 //临时转换 $var=123; $var=12.3; $var=false; $var='king'; $var=null;//null转化成空数组 $res=(array)$var; var_dump($res); echo '<hr/>'; //永久转换,settype($var,$type) $var=123; settype($var,'array'); var_dump($var); |
数组运算符
- 常用数组运算符,+、==、===、!=、<>、!==
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?php //数组运算符相关 //+ 合并数组 $arr1=['a','b','c']; $arr2=['d','e','f']; $newArr=$arr1+$arr2; print_r($newArr); //如果数组键名相同,只会使用左边数组元素的值 $arr1=[ 'a','b','c' ]; $arr2=[ 10=>'c', 11=>'d', 12=>'e' ]; $arr3=[ 'username'=>'king', 'age'=>12 ]; $arr4=[ 'username'=>'queen', 'age'=>23, 'email'=>'382771946@qq.com' ]; $newArr=$arr1+$arr2+$arr3+$arr4; print_r($newArr); echo '<hr/>'; //== 比较数组的键名和键值是否相同,如果相同返回true,否则返回false //=== 既要比较键名和键值是否相同,而且顺序也要相同 $a=[ 3=>'a', '5'=>true ]; $b=[ 5=>1, '3'=>'a' ]; $c=[ '3'=>'a', '5'=>1 ]; var_dump($a==$b,$a===$b,$a==$c,$a===$c); $arr = array('a','b','c'); foreach ($arr as $key=> $value) { $arr[] = 'd'; print_r($arr); var_dump($key,$value); } |
EXAMPLE 1
实现一个表单,接收到数据并将数据保存为数组打印到页面上
reg.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span style="color: #000000;"><!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册页面</title> </head> <body> <form action="doReg.php" method="post"> <input type="text" name="username" placeholder="请输入用户名..."><br/> <input type="password" name="password" placeholder="请输入密码..."><br/> <input type="email" name="email" placeholder="请输入邮箱"><br/> <input type="submit" value="注册"> </form> </body> </html></span> |
doReg.php
1 2 3 4 5 6 |
<?php $username = $_POST['username']; $password = $_POST['password']; $email = $_POST['email']; $userInfo = compact('username','password','email'); print_r($userInfo); |
EXAMPLE 2
使用array()定义数组,分别使用索引数组和关联数组的方式输出下列信息
name:Stefen
sex:male
age:28
email:firefox@163.com
score:95
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php // 关联数组 $arr = ['Stefen','male','age','email','score']; print_r($arr); echo '<hr/>'; $arr = array( 'name' => 'stefen', 'sex' => 'male', 'age' => 23, 'email' => 'firefox@163.com', 'score' => 95 ); print_r($arr); |
EXAMPLE 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php echo '<pre>'; //根据表格使用array()的方式定义数组 //3*5数组 $arr = array( 'ID' => array(132,142,128,132,125), 'name' => array('Demon','Nina','Banny','Tinna','Stefen'), 'age' => array(35,23,36,26,30) ); print_r($arr); //5*3数组 $arr = array( array('ID' => 135, 'name' => 'Demon', 'age' => 35), array('ID' => 142, 'name' => 'Nina', 'age' => 23), array('ID' => 128, 'name' => 'Banny', 'age' => 36), array('ID' => 132, 'name' => 'Tinna', 'age' => 26), array('ID' => 125, 'name' => 'Stefen', 'age' => 30), ); print_r($arr); echo '<pre/>'; ?> |
EXAMPLE 4
下列是希望幼儿园周一和周二的午餐食物表,请将其存储到数组中。
Monday: food:rice;
fruits:apple,grape,peach;
vegetables:potato,carrot,onion,fish;
Tuesday: food:noodles;
fruits:orange,watermelon,mango,cherry;
vegetables:bean,tomato,egg,chicken;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php echo '<pre>'; //使用[]动态创建数组,将题示所给信息全部放入数组中,如何创建? $arr['Monday'] = [ 'food' => ['rice'], 'vegetable' => ['potato','carrot','onion','fish'], 'fruit' => ['apple','grape','peach'] ]; $arr['Tuesday'] =[ 'food' => ['noodles'], 'vagetable' => ['bean','tomato','eggs','chicken'], 'fruits' => ['orange','watermelon','mango','chicken'], ]; //输出数组 print_r($arr); echo '<pre/>'; |
EXAMPLE 5
已知一列差数列的首项是5,公差是3,最大项是首项的5倍加1。请用数组的形式输出该等差数列的每一项。
1 2 3 4 5 6 7 |
<?php //根据提示创建一个公差数组,该怎么创建呢? echo '<pre>'; $arr = range(5, 26,3); //输出数组 print_r($arr); echo '<pre/>'; |
效果:
EXAMPLE 7
请将下列的异常类和错误类定义成常量数组的形式,并输出数组元素“RuntimeException”
1 2 3 4 5 6 7 |
<?php //根据提示创建一个公差数组,该怎么创建呢? echo '<pre>'; $arr = range(5, 26,3); //输出数组 print_r($arr); echo '<pre/>'; |
EXAMPLE 8
下列是不同种类的交通工具的一些属性,先将它们存储在数组里,并按要求对数组进行操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<?php echo '<pre>'; //创建交通工具信息数组$trans $trans = array( array('id' => 612, 'name'=> 'bus', 'weight' => 300, 'capacity' => 22), array('id' => 158, 'name'=> 'taxi', 'weight' => 210, 'capacity' => 5), array('id' => 300, 'name'=> 'coach', 'weight' => 550, 'capacity' => 86), ); //打印输出$trans print_r($trans); //按效果图输出bus的承载量 echo '<hr/>'; print_r($trans[0]); //将交通工具motorbike的信息添加到数组 echo '<hr/>'; $trans[] = array('id' => 105, 'name'=> 'motorbike', 'weight' => 100, 'capacity' => 2); print_r($trans[3]); //按要求修改原名为coach交通工具的信息并输出 echo '<hr/>'; $trans[2]['name'] = 'truck'; $trans[2]['weight'] = 350; print_r($trans[2]); //删除bus的载重属性,删除taxi交通工具(操作数组元素) echo '<hr/>'; unset($trans[0]['weight']); unset($trans[1]); print_r($trans); echo '<pre/>'; ?> |
EXAMPLE 9
将下列变量分别转换成永久性数组,并检测转换后变量的类型。
$int=256;
$float=123.456;
$str=“Today is sunny”;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php //定义变量 echo '<pre>'; $int=256; $float=123.456; $str="Today is sunny"; //临时转换 echo '临时转换:'; $int1 = (array)$int; print_r($int1); $float1 = (array)$float; print_r($float1); $str1 = (array)$str; print_r($str1); echo '<hr/>'; //永久转换 settype($int, 'array'); settype($float, 'array'); settype($str, 'array'); var_dump($int); var_dump($float); var_dump($str); echo '<pre/>'; ?> |
效果:
EXAMPLE 10
将下列数组合并成一个数组
$a=[‘name’=>’HarryPotter’,8=>’male’,’age’=>12,’skill’=>’Magic_fly’,’Hogwarts’];
$b=[‘name’=>’Hermione’,4=>’female’,’12’,’skill’=>’Magic_invisibility’,’school’=> ‘Hogwarts’];
看看$a+$b是否等于$b+$a?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php echo '<pre>'; $a=['name'=>'HarryPotter',8=>'male','age'=>12,'skill'=>'Magic_fly','Hogwarts']; $b=['name'=>'Hermione',4=>'female','12','skill'=>'Magic_invisibility','school'=> 'Hogwarts']; //计算$a+$b和$b+$a并输出计算结果 $ab = $a+$b; print_r($ab); echo '<hr/>'; $ba = $b+$a; print_r($ba); echo '<hr/>'; //输出$a+$b和$b+$a是否相等的比较结果,输出结果必须与效果图一致 echo '($a+$b)是否等于($b+$a)? 相等:true|不等:false'.'<br>'; var_dump($ab==$ba); ?> |
实现效果: