通过 foreach() 来遍历数组 -- 强烈推荐使用
- foreach 分为两种形式:
- 只要键值的情况
foreach (数组名称 as $val) {
// 循环体;
}
- 既要键名又要键值的情况
foreach(数组名称 as $key => $val) {
// 循环体;
}
例子使用:
<?php
header('content-type: text/html;charset=utf-8');
// foreach
$arr = range('a', 'z');
foreach($arr as $val) {
echo $val; // 结果: abcdefghijklmnopqrstuvwxyz
}
echo '<br />';
foreach($arr as $key => $val) {
echo $key.':'.$val.' '; // 结果: 0:a 1:b 2:c 3:d 4:e 5:f 6:g 7:h 8:i 9:j 10:k 11:l 12:m 13:n 14:o 15:p 16:q 17:r 18:s 19:t 20:u 21:v 22:w 23:x 24:y 25:z
}
- 还可以通过
: endforeach;
来代替{}
:
<?php
header('content-type: text/html;charset=utf-8');
// foreach
$arr = range('a', 'z');
foreach($arr as $val):
echo $val; // 结果: abcdefghijklmnopqrstuvwxyz
endforeach;
- PHP 7.0+ foreach 不再改变内部数组指针
在 PHP7 之前, 当数组通过 foreach 迭代是, 数组指针会移动, 现在开始, 不再如此:
<?php
header('content-type: text/html;charset=utf-8');
// foreach
$arr = [0,1,2,3,4];
foreach($arr as &$val) {
var_dump(current($arr));
echo $val.'<br/>';
}
/* PHP 7之前的结果:
int(1) 0
int(2) 1
int(3) 2
int(4) 3
bool(false) 4
*/
/* PHP 7之后的结果:
int(0) 0
int(0) 1
int(0) 2
int(0) 3
int(0) 4
*/
current($array)
返回数组中的当前单元, 后续有介绍
-
foreach 按照值进行循环的时候, foreach 是对该数组的值的拷贝, 操作的是数组的副本
-
foreach 按照引用进行循环的时候, 再循环体内修改数组对循环有影响
<?php
header('content-type: text/html;charset=utf-8');
// foreach
$arr = [0,1,2,3,4];
foreach($arr as $val) {
$val = 'a';
}
print_r($arr);
/* 值的循环结果:
* Array
(
[0] => 0
[1] => 1
[2] => 2
[3] => 3
[4] => 4
)
*/
foreach($arr as &$val) {
$val = 'b';
}
print_r($arr);
/* & 引用的循环结果:
* Array
(
[0] => b
[1] => b
[2] => b
[3] => b
[4] => b
)
*/
注意: 如果 foreach 循环的不是数组,会抛出错误, 在使用之前可以先进行判断
//$arr = [1,2,3,4];
$arr = '1234';
if(is_array($arr)) {
foreach($arr as $key=>$val){
echo $val;
}
}
通过数组指针函数来遍历数组
- 数组指针相关的函数
key($array)
从关联数组中取得键名
语法:key ( array $array )
key() 函数返回数组中内部指针指向的当前单元的键名。 但它不会移动指针。如果内部指针超过了元素列表尾部,或者数组是空的,key() 会返回 NULL。
current($array)
current()
返回数组中的当前单元
语法:current(array &$array)
每个数组中都有一个内部的指针指向它“当前的”单元,初始指向插入到数组中的第一个单元。
current() 函数返回当前被内部指针指向的数组单元的值,并不移动指针。如果内部指针指向超出了单元列表的末端,current() 返回 FALSE。
next($array)
将数组中的内部指针向前移动一位
next() 和 current() 的行为类似,只有一点区别,在返回值之前将内部指针向前移动一位。这意味着它返回的是下一个数组单元的值并将数组指针向前移动了一位。
prev($array)
将数组的内部指针倒回一位
prev() 和 next()的行为类似,只除了它将内部指针倒回一位而不是前移一位。
end($array)
将数组的内部指针指向最后一个单元
end() 将 array 的内部指针移动到最后一个单元并返回其值
reset($array)
将数组的内部指针指向第一个单元
reset() 将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值。
例子:
<?php
header('content-type: text/html;charset=utf-8');
// 指针遍历
$arr = ['username'=>'guoyou','age'=>24,'tel'=>'13510748888','email'=>'guoyou.li@foxmail.com'];
echo '当前的键名:'.key($arr).', 当前的键值为:'.current($arr).'<br />';
next($arr);
echo '下一个的键名:'.key($arr).', 下一个的键值为:'.current($arr).'<br />';
end($arr);
echo '最后一个的键名:'.key($arr).', 最后一个的键值为:'.current($arr).'<br />';
prev($arr);
echo '上一个的键名:'.key($arr).', 上一个的键值为:'.current($arr).'<br />';
reset($arr);
echo '第一个的键名:'.key($arr).', 第一个的键值为:'.current($arr).'<br />';
结果:
// 当前的键名:username, 当前的键值为:guoyou
// 下一个的键名:age, 下一个的键值为:24
// 最后一个的键名:email, 最后一个的键值为:guoyou.li@foxmail.com
// 上一个的键名:tel, 上一个的键值为:13510748888
// 第一个的键名:username, 第一个的键值为:guoyou
通过 each() 和 list() 遍历数组
- list — 把数组中的值赋给一组变量
list() 仅能用于数字索引的数组
<?php
header('content-type: text/html;charset=utf-8');
// $arr = ['username'=>'guoyou','age'=>24,'tel'=>'13510748888','email'=>'guoyou.li@foxmail.com'];
$arr = [1,3,4,5]; // list 索引数组
list($a,$b,$c,$d) = $arr;
echo $a,$b,$c,$d;
// 输出: 1345
list($f,$g,,$h) = $arr;
echo $f,$g,$h; // 135
- each()
返回 array 数组中当前指针位置的键/值对并向前移动数组指针。键值对被返回为四个单元的数组,键名为0,1,key和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。
如果内部指针越过了数组的末端,则 each() 返回 FALSE。
<?php
header('content-type: text/html;charset=utf-8');
$arr = [1,2,3];
$info = each($arr);
print_r($info);
/*
* Array
* (
* [1] => 1
* [value] => 1
* [0] => 0
* [key] => 0
* )
*/
echo key($arr),':',current($arr); // => 1:2
使用 list 和 each 结合 while 循环:
<?php
header('content-type: text/html;charset=utf-8');
$arr = ['a','b','c'];
while(list($key,$val)=each($arr)) {
echo $key.'=>'.$val.'<br />';
}
/* 结果:
0=>a
1=>b
2=>c
*/
学习资料来源: https://class.imooc.com/sc/30
php学习手册
网友评论