一.什麼是迭代器
通過某種統一的方式遍歷鏈表或者數組中的元素的過程叫做迭代遍歷,這種統一的遍歷工具我們叫做迭代器。
二.ArrayIterator迭代器
1:Iterator接口
PHP中的迭代器是通過Iterator接口定義的。包括
current()、key()、next()、rewind()、valid()等方法。
2:方法
foreach默認實現了ArrayIterator的接口。但是我們學習這個迭代器,可以實現更加高級的功能。
比如我們要跳過前n個元素,可以用seek(n),比如在遍歷之前我們要對數組按照鍵值進行排序,可以調用asort(),按鍵名排序用ksort()。
$it = new ArrayIterator ( $fruits ); //ArrayIterator迭代器
$it->seek(2); //跳過$fruits的前2個元素
$it->asort(); //對數組$fruits按照鍵值進行排序
$it->ksort(); //對數組$fruits按照鍵名進行排
實戰代碼
<?php
$fruits = array (
"apple" => "apple value",
"orange" => "orange value",
"grape" => "grape value",
"plum" => "plum value"
);
foreach ( $fruits as $k => $v ) {
echo $k . "=>" . $v . "<br>";
}
echo "****use ArrayIterator in foreach****<br>";
//這裏的foreach和上面的foreach結果一樣,上面的foreach默認實現了這個機制
$it = new ArrayIterator ( $fruits );//ArrayIterator迭代器16 foreach ( $it as $k => $v ) {
echo $k . "=>" . $v . "<br>";
}
echo "****use ArrayIterator in while****<br>";
$it->rewind ();
while ( $it->valid () ) {
echo $it->key () . "=>" . $it->current () . "<br>";
$it->next ();
}
echo "****use ArrayIterator in seek****<br>";
//高級功能,跳過元素
$it->rewind ();
//跳過第幾個元素
if ($it->valid ()) {
while ( $it->valid () ) {
if($it->key()=="orange"){ //跳過第2個元素
$it->next();
}
echo $it->key () . "=>" . $it->current () . "<br>";
$it->next ();
}
}
//跳過前幾個元素
$it->rewind ();
if($it->valid()){
//跳過前幾個元素可以用seek()
$it->seek(2); //跳過前2個元素
while($it->valid()){
echo $it->key () . "=>" . $it->current () . "<br>";
$it->next ();
}
}
//排序功能
echo "****use ArrayIterator in ksort****<br>";
//通過鍵名排序
$it->rewind ();
$it->ksort();
if ($it->valid ()) {
while ( $it->valid () ) {
echo $it->key () . "=>" . $it->current () . "<br>";
$it->next ();
}
}
echo "****use ArrayIterator in asort****<br>";
//通過鍵值排序
$it->rewind ();
$it->asort();
if ($it->valid ()) {
while ( $it->valid () ) {
echo $it->key () . "=>" . $it->current () . "<br>";
$it->next ();
}
}
三.AppendIterator迭代器
1:問題:假設現在有兩個數組要遍歷出來,但是我不想通過兩次foreach遍歷出來,想一次遍歷出來,怎麼辦呢?
那麼,AppendIterator迭代器就可以使用了。
2:代碼實現
<?php
$arr1=array('a','b','c');
$arr2=array('c','d','e');
$it1=new ArrayIterator($arr1);//使數組成爲迭代器
$it2=new ArrayIterator($arr2);//使數組成爲迭代器
$it=new AppendIterator(); //創建一個合成迭代器對象
$it->append($it1); //合成上面的兩個迭代器
$it->append($it2);
foreach ($it as $k=>$v){
echo $k."=>".$v."<br>";
}
四.MultipleIterator迭代器
1:問題:現有兩個數組,一個數組裏面存的是用戶的ID,一個數組裏面存的是用戶的Name,並且兩個數組中的元素一一對應,該如何進行合併呢?
這時候,MultipleIterator迭代器就派上用場了。
2:代碼實現
<?php
$arr1=array('1','2','3');
$arr2=array('ERIC','LIO','DAVID');
$it1=new ArrayIterator($arr1);//創建兩個迭代器
$it2=new ArrayIterator($arr2);//創建兩個迭代器
//以關聯數組的方式聚合
$it=new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);//創建一個迭代器聚合對象,並以關聯數組的方式聚合
$it->attachIterator($it1,"ID");//第一個的關聯名稱爲ID
$it->attachIterator($it2,"NAME");//第二個的關聯名稱爲NAME
foreach ($it as $v){ //關聯結果遍歷
print_r($v);
}
//以索引數組的方式聚合
$it=new MultipleIterator();
$it->attachIterator($it1);
$it->attachIterator($it2);
foreach ($it as $v){
print_r($v);
}
五.FileystemIterator迭代器
1:問題:如何實現linux中的ls功能,如何實現Windows中的dir功能?
Windows中的dir命令如圖:
代碼實現:
<?php
date_default_timezone_set("PRC");
$it = new FilesystemIterator ( '.' );//創建FilesystemIterator迭代器
foreach ( $it as $v ) {
printf("%s\t%s\t%8s\t%s\n",
date("Y/m/d H:i:s",$v->getMtime()),//獲得創建時間
$v->isDir()?"<DIR>":"", //獲得是否是目錄
number_format($v->getSize()), //獲得文件的大小
$v->getFileName() //獲得文件名
);
}