Đã bao giờ bạn gặp phải vấn đề cần lấy tất cả file trong thư mục khác hoặc thư mục trong thư mục khác hay chưa. Trong bài viết này mình sẽ cùng bạn đi tìm hiểu cách list all file and folder trong php
Trong php có các hàm có sẵn giúp chúng ta có thể liệt kê toàn bộ file hoặc thư mục trong thư mục khác như scandir , readdir hoặc glob. Trong bài này mình sẽ hướng dẫn các bạn sử dụng hàm glob vì nó đơn giản và nó cung cấp cho chúng ta một đường dẫn đầy đủ. Còn hàm scandir sẽ chỉ cung cấp tên thư mục hoặc tên file trong thư mục đó. Vd ta có thư mục mydir chứa các file: freetuthay.html,demo.php và thư mục: images,javascript. Nếu sử dụng hàm glob ta sẽ được kết quả như sau:
Trong php có các hàm có sẵn giúp chúng ta có thể liệt kê toàn bộ file hoặc thư mục trong thư mục khác như scandir , readdir hoặc glob. Trong bài này mình sẽ hướng dẫn các bạn sử dụng hàm glob vì nó đơn giản và nó cung cấp cho chúng ta một đường dẫn đầy đủ. Còn hàm scandir sẽ chỉ cung cấp tên thư mục hoặc tên file trong thư mục đó. Vd ta có thư mục mydir chứa các file: freetuthay.html,demo.php và thư mục: images,javascript. Nếu sử dụng hàm glob ta sẽ được kết quả như sau:
Array ( [0] => mydir/freetuthay.html, [1] => mydir/demo.php [2] => mydir/images [3] => mydir/javascript )
Còn nếu sử dụng hàm scandir sẽ được kết quả như thế này:
Array ( [0] => . [1] => .. [2] => freetuthay.html, [3] => demo.php [4] => images [5] => javascript )
Còn với hàm readdir thì nó phải sử dụng đến function opendir và các vòng lặp while điều đó là khá phức tạp và không cần thiết.
Để liệt kê danh sách file và thư mục trong thư mục mydir ta chỉ cần khởi tạo hàm với câu lệnh đơn giản sau
glob('mydir/*');
Trong điều kiện thư mục mydir nằm cùng thư mục chứa với file đang chạy. Có nghĩa là nếu bạn chạy code trong file index.php nằm trong thư mục www/test_code thì thư mục mydir cũng phải nằm trong thư mục test_code. Nếu như thư mục mydir ở bên ngoài thư mục test_code có nghĩa là www/mydir thì bạn thêm dấu .. vào trước. Dấu .. có nghĩa là ra ngoài thư mục 1 bậc lúc này code sẽ là glob('../mydir/*');
Ok, giờ mình sẽ gán biến cho nó:
$files_and_folder = glob('mydir/*'); print_r($files_and_folder); //Hàm debug array (mảng)
Chạy phát xem nào. Hô hô kết quả là như này đây
Array ( [0] => mydir/freetuthay.html, [1] => mydir/demo.php [2] => mydir/images [3] => mydir/javascript )
Ngon rồi giờ bắt đầu lọc theo chỉ lấy thư mục hoặc chỉ lấy file thôi nhé
Chỉ lấy thư mục:
Ở đây chúng ta sẽ gắn flag GLOB_ONLYDIR cho hàm glob. Hiểu nôm na là phát đi một tín hiệu cho function glob và bảo nó là "Mày chỉ được lấy mỗi thư mục thôi đấy nhé".
Ok, let code:
$folder = glob('mydir/*','GLOB_ONLYDIR'); print_r($folder);
Chạy phát nào
Return:
Array ( [0] => mydir/images [1] => mydir/javascript )
Oh yeah, dễ quá phải không ^^
Chỉ get file
Thật là đắng lòng khi php không cung cấp một cái tín hiệu nào (flag) chỉ lấy mỗi file cho function glob. Nhưng không sao chuyện gì cũng có cách giải quyết của nó. Ở đây chúng ta sẽ dùng hàm array_filter vì thằng glob trả về cho ta một mảng nên ta sẽ dùng cái này để lọc mảng.
Code nào:
$files = array_filter(glob('mydir/*'),'is_file');
print_r($files);
Return:
Array ( [0] => mydir/freetuthay.html, [1] => mydir/demo.php
)
Hay chưa hehe
Giờ ta cùng nhau nâng cao hơn tẹo nữa nhé, ta sẽ thêm vài cái filter cho nó ác
Code:
array_filter(glob('mydir/*'),function($file) { return (is_file($file) && filesize($file)<30000); });
Cái này có nghĩa là chỉ lấy những file ở trong thư mục mydir và các file đó nhỏ hơn 30000/1024 kb ^^. Với cách này bạn có thể lọc nhiều hơn như lọc theo tên lọc theo đuôi file với hàm preg_match,... etc
Chúc bạn sẽ thành công và hy vọng bài viết sẽ hữu ích với bạn!!
0 comments:
Post a Comment