返回介绍

6.2.4 list、each 函数遍历数组

发布于 2025-01-30 22:11:33 字数 6404 浏览 0 评论 0 收藏 0

我们来研究两个比较有意思的数组函数。这两个函数学起来不难。但是,有些同学会遇到一点点小困难。困难在于,找到 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 />';

?>

我们来看一下实验结果:

document/2015-09-03/55e84620c4180

分析结果如图:

document/2015-09-03/55e8466feae5c

结论:

  1. 将下标为 0 的张三赋值给了$one
  2. 将下标为 1 的李四赋值给了$two
  3. 将下标为 2 的王五赋值给了$three

因此,我们知道了 list 的功能就是从左到右,一一对应索引数组从 0 开始的下标值。

list 的另外一种用法:

<?php

list( ,  , $three) = array('张三' ,'李四' ,'王五');

echo '$one----'.$one.'<br />';
echo '$two----'.$two.'<br />';
echo '$three----'.$three.'<br />';

?>

运行结果:

document/2015-09-03/55e84749ce01e

结论:

  1. list 当中的第一、二个放变量的地方留空,我只写了$three。
  2. 按照一一对应原则,张三和李四没有变量可以对应。
  3. 所以只有王五有变量对应

请严格记住:索引数组的一一对应原则。list 第一个变量对应的是下标为 0 的数组元素,下标为 1 的对应的是 list 里面的第二个数组元素。

请猜猜下面的结果是多少? 为什么?

<?php
list($one, $two, $three) = array(2 => '张三', '李四', '王五');

echo '$one----' . $one . '<br />';
echo '$two----' . $two . '<br />';
echo '$three----' . $three . '<br />';

?>

运行结果如下图:

document/2015-09-03/55e8491dd1ec6

总结:

  1. 因为是一一对应原则,$one 找不到下标为 0 的数组元素,$two 找不到下标为 1 的数组元素,只有$three 找到了下标为 2 的数组元素
  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 的结果:
document/2015-09-03/55e84d53179fc

总结:
1.读取了$kongjie 中的第一个元素,将第一个元素('gao'=>'穿黑衣服的')分解开了。

  1. 分解后第一个元素变成了一个新数组。
  2. 在新数组里面,将原值(穿黑衣服的)放了索引下标 1 里面,同时放到了关联下标 value 里面。
  3. 在新数组里面,将原键(gao),放到了关联下标 key 里面,放到了索引下标 0 里面。

我们用图来表示:

document/2015-09-03/55e84f4676360

这样我们一下子就看明白了。

接下来我们说说 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 />';

?>

执行结果:
document/2015-09-03/55e85015cf476

总结:

  1. 读一次向后移动一次【可以想象有一个记录的箭头在移动】,将其中的每个元素拆解成一个新数组
  2. 读取到最后,没有可操作的元素了,所以返回了 false。

list 和 each 配合

我们知道了 list 的特性,也知道了 each 的特性。那 list 是不是可以和 each 配合起来一起来完成一些工作呢?

list($key,$value) = each($array);

我们来看之前说到的这个图:

document/2015-09-03/55e84f4676360

而 list 中的第一个变量会去找索引下面 0 的元素去赋值,第二个变量会找索引下标为 1 的元素对变量赋值。

我们来看看下面例子:

<?php

//定义一个变量叫$kongjie(空姐)
$kongjie=[
'gao'=>'穿黑衣服的',
'shou'=>'退特别长特别细',
'mei'=>'好白',
];

list($key,$value) = each($kongjie);

echo $key. '-----' .$value .'<br />';

?>

运行结果如下:

document/2015-09-03/55e85194206dc

总结:

  1. each 把变量拆成了 4 个元素
  2. 而 list 把 0 =>gao 赋值给了变量$key
  3. list 把 1 => 穿黑衣服的 赋值给了变量 $value

each 到最后会返回 false,因此我可以用布尔型循环 while 来配合完成数组的循环。

把上面的代码,轻轻一改就实现了如下效果:

<?php

//定义一个变量叫$kongjie(空姐)
$kongjie=[
'gao'=>'穿黑衣服的',
'shou'=>'退特别长特别细',
'mei'=>'好白',
];

while(list($key,$value) = each($kongjie)){

echo $key. '-----' .$value .'<br />';

}

?>

执行演示:
document/2015-09-03/55e8527586ffe

总结:

  1. 循环一次,执行一次 each,执行代码,然后向后移动一个元素
  2. 执行到最后返回 fasle,因此停止执行。
  3. 可以通过 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','妖人'),
),
);
?>

遍历显示出来,效果如下:
document/2015-09-03/55e83877dbd0f

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文