@Zjmainstay
2016-07-05T11:02:12.000000Z
字数 4299
阅读 1425
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);
/*
//Result
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) }
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);
/*
//Result
Array
(
[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 />";
}
/*
//Result
name : Zjmainstay
age : 24
job : 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']}";
/*
//Result
Title: 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: Text1
Link: <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: Text2
Link: <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: Text3
Link: <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