@Zjmainstay
2016-07-05T03:02:12.000000Z
字数 4299
阅读 1613
zjblog PHP 数组
本文对数组的使用做引导式分析,并结合案例,让你能够熟练地应用数组。
(1)按类型
> * 索引数组
> * 关联数组
(2) 按层级
> * 一维数组
> * 多维数组
索引数组,以整数从0到n作为键值,自动递增
关联数组,可以是字符串或整数作为键值
一维数组,值中不包含数组的数组
多维数组,值还是数组的数组,可以嵌套多层
取值,直接键位取值或遍历取值
首先,要熟练使用数组,必须学会查看数组结构。
print_r 和 var_dump 函数都是很好展示数组结构的工具,使用时可能有时候看起来内容比较乱,此时可以在它调用之前加一个 echo '<pre>';,通过HTML的<pre>标签格式化内容,就比较好看了。
示例一:
<?php$arr = array(1, 2, 3, 4, 5);print_r($arr);echo '<br />';var_dump($arr);echo '<br />';echo '<pre>';print_r($arr);echo '<br />';var_dump($arr);/*//ResultArray ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) }Array([0] => 1[1] => 2[2] => 3[3] => 4[4] => 5)array(5) {[0]=>int(1)[1]=>int(2)[2]=>int(3)[3]=>int(4)[4]=>int(5)}*/
使用var_dump可以比较清楚的看到数据类型,比如null 和 '' ,在使用print_r打印时,我们看到的结果都是一样的,而var_dump可以区分开来,所以,我建议使用var_dump。
示例二:
<?php$arr = array('name' => 'Zjmainstay','house' => null,'car' => '','job' => true,);echo '<pre>';print_r($arr);echo '<br />';var_dump($arr);/*//ResultArray([name] => Zjmainstay[house] =>[car] =>[job] => 1)array(4) {["name"]=>string(10) "Zjmainstay"["house"]=>NULL["car"]=>string(0) ""["job"]=>bool(true)}*/
上面举例都是一维数组的,现在我们就来看看这些一维数组的取值。
我们就以
$arr = array('name' => 'Zjmainstay','house' => null,'car' => '','job' => true,);
为例,这里,我要取到name,有2种方式:
1. 直接通过键名取值
直接取值是最合理的取值方式,我们在这里就叫它“所见即所得”,数组取值本来就是通过结构分析,取值,看到什么拿什么。
echo $arr['name'];//Result: Zjmainstay
示例三:
<?php$arr = array('name' => 'Zjmainstay','age' => 24,'job' => 'PHP工程师',);//期望结果://我的名字叫Zjmainstay,24岁,是一名PHP工程师。foreach($arr as $key => $value) {if($key == 'name') {echo "我的名字叫{$value},";} else if($key == 'age') {echo "{$value}岁,";} else if($key == 'job') {echo "是一名{$value}。";}}//输出结果确实是://我的名字叫Zjmainstay,24岁,是一名PHP工程师。//好像并没有什么问题,但是,这只不过是巧合,假如,我把数组打乱顺序了,再看看,我们得到什么echo '<br />';ksort($arr); //按键名顺序排序var_dump($arr);echo '<br />';foreach($arr as $key => $value) {if($key == 'name') {echo "我的名字叫{$value},";} else if($key == 'age') {echo "{$key}岁,";} else if($key == 'job') {echo "是一名{$value}。";}}/*正确结果:我的名字叫Zjmainstay,24岁,是一名PHP工程师。新排序数组:array(3) { ["age"]=> int(24) ["job"]=> string(12) "PHP工程师" ["name"]=> string(10) "Zjmainstay" }新数组结果:24岁,是一名PHP工程师。我的名字叫Zjmainstay,*/
看到新数组的结果,是否瞬间凌乱?问题出在哪里?
foreach遍历的时候,从第一个到最后一个,然后新数组第一个是age,那它在if判断中就会匹配到$key == 'age'的分支,然后,输出了相应的结果,所以,结果就错了。
因此,这里,正确的做法就是,直接,所见即所得,直接输出:
echo "我的名字叫{$arr['name']},{$arr['age']}岁,是一名{$arr['job']}。";
那么,是不是不能用遍历比较键名了?
答案是否定的。
只有在不考虑排序的情况下,才能使用遍历比较键名的方式做处理,否则可能会因为排序错乱而导致不可预知的结果。
示例四:
<?php$arr = array('name' => 'Zjmainstay','age' => 24,'job' => 'PHP工程师',);//我需要输出键值对,并且把工作的PHP改成小写显示foreach($arr as $key => $value) {if($key == 'job') {$value = strtolower($value);}echo "{$key} : {$value} <br />";}/*//Resultname : Zjmainstayage : 24job : php工程师*/
对于一维数组,特别是关联数组,单一的值直接通过键值取值就行了。
遍历是对数组的一个顺序取值,循环一遍一个个取出来。
多维数组的取值其实跟一维数组一样,只不过它的值又是一个数组,需要再遍历一遍而已。我们可以通过打印结构,一层层观察定位到我们需要找的值。
示例五:
<?php//常见配置文件格式$arr = array('mysql' => array('host' => 'localhost','user' => 'root','password' => 'root','port' => 3306,'database' => 'test',),'site' => array('title' => 'Zjmainstay学习笔记','desc' => 'PHP,技术交流,技术积累,技术分享',),);//我们要取站点标题和描述//只需要一层层取就行了echo "Title: {$arr['site']['title']} <br />";echo "Desc: {$arr['site']['desc']}";/*//ResultTitle: Zjmainstay学习笔记Desc: PHP,技术交流,技术积累,技术分享*/
再有就是需要遍历输出数据的
示例六:
<?php//常见数据结构$items = array(array('title' => 'Text1','url' => 'url1','pic' => array('pic_1_1.jpg','pic_1_2.jpg','pic_1_3.jpg',),),array('title' => 'Text2','url' => 'url2','pic' => array('pic_2_1.jpg','pic_2_2.jpg','pic_2_3.jpg',),),array('title' => 'Text3','url' => 'url3','pic' => array('pic_3_1.jpg','pic_3_2.jpg','pic_3_3.jpg',),),);foreach($items as $item) {echo "<div>\n";echo "Title: {$item['title']}\n";echo "Link: <a href='{$item['url']}' title='{$item['title']}'>{$item['title']}</a>\n";foreach($item['pic'] as $index => $pic) {echo "Pic{$index}: <img src='{$pic}' />\n";}echo "</div>\n";}/*//Result<div>Title: Text1Link: <a href='url1' title='Text1'>Text1</a>Pic0: <img src='pic_1_1.jpg' />Pic1: <img src='pic_1_2.jpg' />Pic2: <img src='pic_1_3.jpg' /></div><div>Title: Text2Link: <a href='url2' title='Text2'>Text2</a>Pic0: <img src='pic_2_1.jpg' />Pic1: <img src='pic_2_2.jpg' />Pic2: <img src='pic_2_3.jpg' /></div><div>Title: Text3Link: <a href='url3' title='Text3'>Text3</a>Pic0: <img src='pic_3_1.jpg' />Pic1: <img src='pic_3_2.jpg' />Pic2: <img src='pic_3_3.jpg' /></div>*/
数组并不复杂,当发现理不清的时候,借助var_dump函数查看结构,然后再取值即可。
数组有一系列的 array_ 前缀函数,还有一些排序之类函数,读者需逐个阅读一遍用法,尽可能熟悉每个函数,同时需要学习几个循环结构(for/foreach/while/do-while)。
PHP手册数组系列:http://php.net/manual/zh/book.array.php