PHP5 เพิ่ม Iterator ซึ่งเป็นชุดอินเทอร์เฟซสำเร็จรูปที่ช่วยนำทางและจัดการโครงสร้างข้อมูลแบบลำดับชั้น นี่เป็นหนึ่งในคุณสมบัติใหม่ที่น่าสนใจที่สุดของ PHP5
ตัววนซ้ำเหล่านี้จะลดโค้ดที่จำเป็นในการประมวลผลแผนผังเอกสาร XML หรือคอลเลกชันไฟล์ลงอย่างมาก ตัววนซ้ำจำนวนมากถูกใช้ใน PHP5 รวมถึง ArrayIterator, CachingIterator, LimitIterator, RecursiveIterator, SimpleXMLIterator และ DirectoryIterator
DirectoryIterator สามารถประมวลผลไฟล์ในไดเร็กทอรีได้อย่างรวดเร็วและมีประสิทธิภาพ ด้วยความคิดสร้างสรรค์ที่เพิ่มขึ้นเล็กน้อยในกระบวนการเขียนโค้ด DirectoryIterator ยังสามารถใช้เพื่อประมวลผลแผนผังไดเร็กทอรีที่ซ้อนกันแบบวนซ้ำได้ งานทั้งสองสามารถทำได้สำเร็จโดยใช้โค้ดเพียงไม่กี่บรรทัด ซึ่งเป็นการปรับปรุงที่สำคัญเหนือแนวทาง "มาตรฐาน"
การประมวลผลไดเร็กทอรีระดับเดียว ขั้นแรกเราเริ่มต้นด้วยงานง่ายๆ: การประมวลผลไดเร็กทอรีระดับเดียว ป้อน (หรือคัดลอก) รหัสต่อไปนี้ (รายการ A) แก้ไขเส้นทางไดเรกทอรีเพื่อให้สะท้อนถึงการกำหนดค่าในเครื่อง:
รายการ A
<?php$it = new DirectoryIterator("/tmp/mystuff");foreach($it as $file) {if ( !$it->isDot()) {echo $file . "n";}}?>ดูผลลัพธ์ของโค้ดนี้ในเบราว์เซอร์ คุณจะเห็นรายการไฟล์ในไดเร็กทอรีที่ระบุ สิ่งนี้เกิดขึ้นได้อย่างไร? DirectoryIterator จัดเตรียมอินเทอร์เฟซที่กำหนดไว้ล่วงหน้าสำหรับการเรียกคืนเนื้อหาของไดเร็กทอรี เมื่อตำแหน่งของไดเร็กทอรีเป้าหมายถูกสุ่มตัวอย่างแล้ว จะถือว่าเป็นอาร์เรย์ PHP มาตรฐาน โดยแต่ละองค์ประกอบจะแสดงไฟล์ในไดเร็กทอรี โปรดทราบว่าใช้เมธอด isDot () เพื่อกรองไดเร็กทอรี "." และ ".." ตามลำดับ
การจัดการแผนผังไดเร็กทอรีที่ซ้อนกัน การจัดการแผนผังไดเร็กทอรีที่ซ้อนกันแบบเรียกซ้ำนั้นแทบจะเป็นเรื่องง่ายเหมือนกัน ในกรณีนี้ DirectoryIterator จำเป็นต้องตรวจสอบทุกอ็อบเจ็กต์ที่พบในไดเร็กทอรีระดับเดียวเพื่อพิจารณาว่าเป็นไฟล์หรือไดเร็กทอรี หากเป็นไดเร็กทอรี ให้ลึกลงไปหนึ่งระดับเพื่อตรวจสอบเนื้อหาของระดับถัดไป สิ่งนี้อาจฟังดูค่อนข้างซับซ้อน และโดยทั่วไปแล้วในอดีตจำเป็นต้องใช้โค้ดมากกว่า 15 บรรทัด
อย่างไรก็ตาม ด้วย PHP5 คุณจำเป็นต้องมี Iterator ใหม่สองตัวเท่านั้น: RecursiveIterator และ RecursiveIteratorIterator ซึ่งรวมคุณสมบัติข้างต้นทั้งหมดเข้าด้วยกัน ดูรายการ B:
รายการ B
<?php$it = new RecursiveDirectoryIterator("/tmp");foreach(new RecursiveIteratorIterator($it) as $file) {echo $file . "n";}?>ในขณะนี้ ให้ป้อน ผลลัพธ์ไฟล์และไดเร็กทอรีทั้งหมดภายใต้ไดเร็กทอรีเริ่มต้นจะแสดงรายการ ไม่จำเป็นต้องพูด อินเทอร์เฟซแบบเรียกซ้ำนี้สะดวกมากหากคุณต้องการประมวลผลไฟล์ทั้งหมดภายใต้ระดับไดเร็กทอรีเฉพาะ เช่น การบีบอัดแผนผังไดเร็กทอรีแบบเรียกซ้ำ หรือแก้ไขสิทธิ์ของกลุ่ม/เจ้าของชุดของไฟล์ที่ซ้อนกัน
แอปพลิเคชันในชีวิตจริง: การพิมพ์แผนผังไดเร็กทอรี การพิมพ์แผนผังไดเร็กทอรีแบบกราฟิกเป็นแอปพลิเคชันทั่วไปของการเรียกซ้ำไดเร็กทอรี การใช้ Iterator เพื่อจัดการงานนี้ทำได้ง่ายมาก เนื่องจากเอกสารคลาส Iterator มีคลาสอินสแตนซ์ที่เขียนขึ้นสำหรับแอปพลิเคชันนี้โดยเฉพาะ DirectoryTreeIterator (ขอบคุณ Marcus Boerger) ให้การปรับปรุงอื่นๆ สำหรับ RecursiveIteratorIterator ที่กล่าวถึงก่อนหน้านี้ โดยเฉพาะแท็ก ASCII ที่แสดงความลึกและตำแหน่งในโครงสร้างแบบต้นไม้
รายการ C แสดงให้เห็นถึงการใช้ DirectoryTreeIterator
รายการ C
<?php$it = new DirectoryTreeIterator("/tmp/cookbook/");foreach($it as $path) {echo $path . "n";}?>นี่คือส่วนหนึ่งของผลลัพธ์ที่คุณเห็น:
| -ch01|.-recipe01|. -example01.php| เข้าใจคุณค่าของ DirectoryIterators เหล่านี้ได้ดีขึ้น ลองเขียนโค้ดแอปพลิเคชันสามตัวที่แสดงในบทช่วยสอนนี้โดยใช้ฟังก์ชันไฟล์และไดเรกทอรีมาตรฐาน