2010-10-20 47 views
13

Tôi đang sử dụng mã PHP sau đây để liệt kê tất cả các file và thư mục trong thư mục hiện hành: (? Có lẽ nó được sắp xếp theo ngày tạo Tôi không chắc chắn)Làm cách nào để liệt kê tất cả các tệp trong thư mục được sắp xếp theo thứ tự bảng chữ cái bằng PHP?

<?php 
    $dirname = "."; 
    $dir = opendir($dirname); 

    while(false != ($file = readdir($dir))) 
     { 
      if(($file != ".") and ($file != "..") and ($file != "index.php")) 
      { 
       echo("<a href='$file'>$file</a> <br />"); 
     } 
    } 
?> 

Vấn đề là danh sách không được ra lệnh theo thứ tự abc .

Làm cách nào để đảm bảo rằng nó được sắp xếp theo thứ tự abc?

Trả lời

31

Các manual nói rõ rằng:

readdir
Trả về tên tập tin của tập tin kế tiếp từ thư mục. Các tên tệp được trả về theo thứ tự mà chúng được lưu trữ bởi hệ thống tệp.

Những gì bạn có thể làm là lưu trữ các tập tin trong một mảng, sắp xếp nó và sau đó in nội dung của nó như:

$files = array(); 
$dir = opendir('.'); // open the cwd..also do an err check. 
while(false != ($file = readdir($dir))) { 
     if(($file != ".") and ($file != "..") and ($file != "index.php")) { 
       $files[] = $file; // put in array. 
     } 
} 

natsort($files); // sort. 

// print. 
foreach($files as $file) { 
     echo("<a href='$file'>$file</a> <br />\n"); 
} 
+0

Đây là lần đầu tiên tôi sử dụng PHP. Tôi chỉ cần nó để liệt kê một số thứ tôi tải lên apache của tôi. Bạn có thể vui lòng chỉ cho tôi cách lưu trữ các tệp trong một mảng và sắp xếp nó không? –

+1

+1 cho natsort() thậm chí có thể muốn suy nghĩ về natcasesort() –

+1

@David bạn có thể sử dụng '$ files = glob ("/your/path/* ");' –

1

Sử dụng globsort cần làm việc.

+2

không cần sắp xếp() nếu bạn sử dụng glob() vì nó sắp xếp theo thứ tự abc theo mặc định –

2

Bạn có thể đặt tất cả các tên thư mục bên trong một mảng như:

$array[] = $file; 

Sau đó bạn có thể sắp xếp các mảng với:

sort($array); 

Và sau đó in các liên kết với nội dung đó.

Tôi hy vọng sự trợ giúp này.

2
<?php 
$dirname = "."; 
$dir = opendir($dirname); 

while(false != ($file = readdir($dir))) 
{ 
if(($file != ".") and ($file != "..") and ($file != "index.php")) 
{ 
    $list[] = $file; 
} 
} 

sort($list); 

foreach($list as $item) { 
echo("<a href='$item'>$item</a> <br />"); 
} 
?> 
+1

Thực hành tốt, thêm '$ list = array();' trước khi sử dụng nó. –

1

Tôi khuyên bạn nên di chuyển khỏi opendir cũ()/readdir(). Hoặc sử dụng glob() hoặc nếu bạn gặp phải nhiều tệp trong một thư mục, hãy sử dụng Lớp DirectoryIterator (es):

http://www.php.net/manual/en/class.directoryiterator.php http://www.php.net/manual/en/function.glob.php

Trân

+0

Jan, Lý do không sử dụng openddir/readdir là gì? Không được chấp nhận. –

+0

vì OOP là con đường để đi. Ngoài ra các lớp Iterator có rất nhiều tính năng được cài đặt sẵn trong php, mà bạn sẽ phải viết mã thủ công khi bạn sử dụng opendir(). Vì vậy, tôi tin rằng điều này cũng sẽ tốt hơn cho lý do hiệu suất hoặc bảo mật. –

+0

http://en.wikipedia.org/wiki/No_Silver_Bullet :) –

4
<?php 
function getFiles(){ 
    $files=array(); 
    if($dir=opendir('.')){ 
     while($file=readdir($dir)){ 
      if($file!='.' && $file!='..' && $file!=basename(__FILE__)){ 
       $files[]=$file; 
      } 
     } 
     closedir($dir); 
    } 
    natsort($files); //sort 
    return $files; 
} 
?> 

<html> 
<head> 
</head> 
<body> 

<h1> List of files </h1> 

<ul class="dir"> 
    <? foreach(getFiles() as $file) 
     echo "<li name='$file'><a href='$file'>$file</a></li>"; 
    ?> 
</ul> 

</body> 
</html> 
Các vấn đề liên quan