我们来研究两个比较有意思的数组函数。这两个函数学起来不难。但是,有些同学会遇到一点点小困难。困难在于,找到list函数和each函数的操作特点。
list函数
我们先来讲list函数:
list ( mixed $变量1 [, mixed $变量n ] )
它的功能:将索引数组下标为0的对应我变量1,下标1的对应变量2,依此类推。
我们来通过实验来看一下:
<?php
list($one , $two , $three) = array("张三" ,"李四" ,"王五");
//再次声明:单引号不结释变量,所以输出的是字符串$one
echo "$one----".$one."<br />";
echo "$two----".$two."<br />";
echo "$three----".$three."<br />";
?>
我们来看一下实验结果:
分析结果如图:
结论:
- 将下标为0的张三赋值给了$one
- 将下标为1的李四赋值给了$two
- 将下标为2的王五赋值给了$three
因此,我们知道了list的功能就是从左到右,一一对应索引数组从0开始的下标值。
list的另外一种用法:
<?php
list( , , $three) = array("张三" ,"李四" ,"王五");
echo "$one----".$one."<br />";
echo "$two----".$two."<br />";
echo "$three----".$three."<br />";
?>
运行结果:
结论:
- list当中的第一、二个放变量的地方留空,我只写了$three。
- 按照一一对应原则,张三和李四没有变量可以对应。
- 所以只有王五有变量对应
请严格记住:索引数组的一一对应原则。list第一个变量对应的是下标为0的数组元素,下标为1的对应的是list里面的第二个数组元素。
请猜猜下面的结果是多少? 为什么?
<?php
list($one, $two, $three) = array(2 => "张三", "李四", "王五");
echo "$one----" . $one . "<br />";
echo "$two----" . $two . "<br />";
echo "$three----" . $three . "<br />";
?>
运行结果如下图:
总结:
- 因为是一一对应原则,$one找不到下标为0的数组元素,$two找不到下标为1的数组元素,只有$three找到了下标为2的数组元素
- 在list($one, $two, $three),我只写了三个变量。对应完成,无需再对应后面的变量了,丢弃李四和王五。
each函数
each 函数的规律性上面就更有特点了,并且比较有趣。
array each ( array &$array )
功能:传入一个数组。它会将其中的一个元素拆为个新数组。每次执行这样操作一个元素。执行一次先后移动一次,同样的方式操作下一个数组元素。执行到最后,返回false。
我们先来看看each是怎么操作的数组元素。
<?php
//定义一个变量叫$kongjie(空姐)
$kongjie=[
"gao"=>"穿黑衣服的",
"shou"=>"腿特别长特别细",
"mei"=>"好白",
"pl"=>"五官端正",
"type"=>"那就是女神",
"我是屌丝不敢跟女神搭讪"
];
//第一次each
$data = each($kongjie);
echo "<pre>";
var_dump($data);
echo "</pre>";
?>
我们来看看第一次执行each的结果:
总结:
1.读取了$kongjie中的第一个元素,将第一个元素("gao"=>"穿黑衣服的")分解开了。
- 分解后第一个元素变成了一个新数组。
- 在新数组里面,将原值(穿黑衣服的)放了索引下标1里面,同时放到了关联下标value里面。
- 在新数组里面,将原键(gao),放到了关联下标key里面,放到了索引下标0里面。
我们用图来表示:
这样我们一下子就看明白了。
接下来我们说说each的另外一个特性。读一次,向后移动一个元素。
<?php
//定义一个变量叫$kongjie(空姐)
$kongjie=[
"gao"=>"穿黑衣服的",
"shou"=>"退特别长特别细",
"mei"=>"好白",
];
//第一次each
$data = each($kongjie);
echo "<pre>";
var_dump($data);
echo "</pre>";
echo "-----华丽丽分割线------<br />";
//第2次each
$data = each($kongjie);
echo "<pre>";
var_dump($data);
echo "</pre>";
echo "-----华丽丽分割线------<br />";
//第3次each【执行到了最后一个元素了】
$data = each($kongjie);
echo "<pre>";
var_dump($data);
echo "</pre>";
echo "-----华丽丽分割线------<br />";
//第4次【此时,后面已没有可操作的元素了,看返回什么】
$data = each($kongjie);
echo "<pre>";
var_dump($data);
echo "</pre>";
echo "-----华丽丽分割线------<br />";
?>
执行结果:
总结:
- 读一次向后移动一次【可以想象有一个记录的箭头在移动】,将其中的每个元素拆解成一个新数组
- 读取到最后,没有可操作的元素了,所以返回了false。
list 和each 配合
我们知道了list的特性,也知道了each的特性。那list是不是可以和each配合起来一起来完成一些工作呢?
list($key,$value) = each($array);
我们来看之前说到的这个图:
而list中的第一个变量会去找索引下面0的元素去赋值,第二个变量会找索引下标为1的元素对变量赋值。
我们来看看下面例子:
<?php
//定义一个变量叫$kongjie(空姐)
$kongjie=[
"gao"=>"穿黑衣服的",
"shou"=>"退特别长特别细",
"mei"=>"好白",
];
list($key,$value) = each($kongjie);
echo $key. "-----" .$value ."<br />";
?>
运行结果如下:
总结:
- each 把变量拆成了4个元素
- 而list把0 =>gao 赋值给了变量$key
- list把1 => 穿黑衣服的 赋值给了变量 $value
each到最后会返回false,因此我可以用布尔型循环while来配合完成数组的循环。
把上面的代码,轻轻一改就实现了如下效果:
<?php
//定义一个变量叫$kongjie(空姐)
$kongjie=[
"gao"=>"穿黑衣服的",
"shou"=>"退特别长特别细",
"mei"=>"好白",
];
while(list($key,$value) = each($kongjie)){
echo $key. "-----" .$value ."<br />";
}
?>
执行演示:
总结:
- 循环一次,执行一次each,执行代码,然后向后移动一个元素
- 执行到最后返回fasle,因此停止执行。
- 可以通过each和list配合实现foreach一样的效果。
作业:
使用list和each配合,将如下数组:
<?php
$arr=array(
"教学部"=>array(
array("李某","18","人妖"),
array("高某","20","男"),
array("张某","21","妖人"),
),
"宣传部"=>array(
array("李某","18","人妖"),
array("高某","20","男"),
array("张某","21","妖人"),
),
"财务部"=>array(
array("李某","18","人妖"),
array("高某","20","男"),
array("张某","21","妖人"),
),
);
?>
遍历显示出来,效果如下: