在PHP中遍历一个数组或是对象有很多方法,先看第一种:
// 定义数组
$array = ['a' => 'php', 'b' => 'asp', 'c' => 'jsp'];
// 输出 abc
while($data = each($array)){
echo $data[0];
}
// 再次循环,没有输出、甚至连***都没有输出
while($data = each($array)){
echo "***";
echo $data[0];
}
each()
:返回数组中指针指向的键值,以数组形式返回,同时将指针往前移动一步。
明白了 each()
函数的意义,就知道上例中第二次为什么没有输出了,这时候可以使用 reset()
函数。
reset()
:将数组中的指针移动到第一位。
在看看效果:
// 定义数组
$array = ['a' => 'php', 'b' => 'asp', 'c' => 'jsp'];
// 输出 abc
while($data = each($array)){
echo $data[0];
}
// 更新指针
reset($array);
// 输出 abc
while($data = each($array)){
echo $data[0];
}
功能和效果是实现了,但是PHP 为这种遍历特地提供了一种方法,那就是 foreach
循环结构。
// a:php b:asp c:jsp
foreach ($array as $key => $value) {
echo $key . ':' . $value . ' ';
}
// php asp jsp
foreach ($array as $value) {
echo $value . ' ';
}
// 支持用冒号的方式取代大括号
// a:php b:asp c:jsp
foreach ($array as $key => $value):
echo $key . ':' . $value . ' ';
endforeach;
上例中使用了多次foreach
循环遍历,但是并没有使用reset()
来更新指针,这是因为foreach
在开始执行时,自动将数组内部的指针移向了第一个元素。
如果要在遍历的同时修改数组元素,可以通过键或是引用赋值来进行。
// 定义数组
$array = ['a' => 'php', 'b' => 'asp', 'c' => 'jsp'];
// 输出 a:PHP b:ASP c:JSP
foreach ($array as $key => &$value) {
$value = strtoupper($value);
echo $key . ':' . $value . ' ';
}
需要注意的是,foreach
循环完了之后,其$value
变量还存在,建议使用 unset()
函数来销毁,特别是使用引用赋值的时候,很有可能一不小心就将数组的内容更改了。
foreach
也可以遍历对象,看代码:
// 定义对象
class Example{
private $one = "private";
protected $two = "protected";
public $three = "public";
static $four = "static";
public function getOne(){
return $this->one;
}
}
// 实例化
$exam = new Example();
// 输出 three : public
foreach ($exam as $key => $value) {
echo "$key : $value <br />";
}
事实上,foreach
也只能遍历数组和对象,对于其他类型的数据直接报错。
在处理多维数组的时候,如果配合list()
函数一起使用,将会省事很多。
list()
:把数组中的值赋给一组变量
// 定义数组
$array = [
['php', 'mysql'],
['asp', 'sqlserver'],
['jsp', 'oracle'],
];
// 第一种方式
foreach ($array as $data) {
$key = $data[0];
$value = $data[1];
echo "$key : $value <br />";
}
// 第二种方式
foreach ($array as list($key, $value)) {
echo "$key : $value <br />";
}
list()
函数的参数数量 和 数组中的元素数量 应该一致,可以少,但是不可以多,否则会报错,不想要的可以用逗号隔开留空就行。
list($a, , $c) = ['aaa', 'bbb', 'ccc'];