在PHP中遍歷一個數(shù)組或是對象有很多方法,先看第一種:
// 定義數(shù)組
$array = ['a' => 'php', 'b' => 'asp', 'c' => 'jsp'];
// 輸出 abc
while($data = each($array)){
echo $data[0];
}
// 再次循環(huán),沒有輸出、甚至連***都沒有輸出
while($data = each($array)){
echo "***";
echo $data[0];
}
each()
:返回數(shù)組中指針指向的鍵值,以數(shù)組形式返回,同時將指針往前移動一步。
明白了 each()
函數(shù)的意義,就知道上例中第二次為什么沒有輸出了,這時候可以使用 reset()
函數(shù)。
reset()
:將數(shù)組中的指針移動到第一位。
在看看效果:
// 定義數(shù)組
$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];
}
功能和效果是實現(xiàn)了,但是PHP 為這種遍歷特地提供了一種方法,那就是 foreach
循環(huán)結(jié)構(gòu)。
// 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
循環(huán)遍歷,但是并沒有使用reset()
來更新指針,這是因為foreach
在開始執(zhí)行時,自動將數(shù)組內(nèi)部的指針移向了第一個元素。
如果要在遍歷的同時修改數(shù)組元素,可以通過鍵或是引用賦值來進行。
// 定義數(shù)組
$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
循環(huán)完了之后,其$value
變量還存在,建議使用 unset()
函數(shù)來銷毀,特別是使用引用賦值的時候,很有可能一不小心就將數(shù)組的內(nèi)容更改了。
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
也只能遍歷數(shù)組和對象,對于其他類型的數(shù)據(jù)直接報錯。
在處理多維數(shù)組的時候,如果配合list()
函數(shù)一起使用,將會省事很多。
list()
:把數(shù)組中的值賦給一組變量
// 定義數(shù)組
$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()
函數(shù)的參數(shù)數(shù)量 和 數(shù)組中的元素數(shù)量 應(yīng)該一致,可以少,但是不可以多,否則會報錯,不想要的可以用逗號隔開留空就行。
list($a, , $c) = ['aaa', 'bbb', 'ccc'];