2015-05-13 85 views
2

我有一個腳本掃描一個文件夾,並將它包含的文件名稱放入一個數組中。 然後我洗牌數組並顯示文件名。PHP掃描目錄和數組

像這樣:

$count=0; 
$ar=array(); 
$i=1; 
$g=scandir('./images/'); 

foreach($g as $x) 
{ 
    if(is_dir($x))$ar[$x]=scandir($x); 
    else 
    { 
     $count++; 
     $ar[]=$x; 
    } 
} 
shuffle($ar); 

while($i <= $count) 
{ 
    echo $ar[$i-1]; 
    $i++; 
} 
?> 

它運作良好,但由於某些原因,我得到這樣的:

  • fff.jpg
  • ccc.jpg
  • 陣列
  • NNN .jpg
  • ttt.jpg
  • sss.jpg
  • bbb.jpg
  • 陣列
  • eee.jpg

當然,爲了當我刷新頁面變化,因爲洗牌我做的,但當中200名我總是將這2個「數組」放在列表中的某處。

它可能是什麼?

謝謝

+2

[水珠()](http://php.net/manual/en/function.glob.php)是更有趣 –

+0

@Dagon * blob blob *我認爲這將是魚:)你的意思是glob? – Rizier123

+0

是的,腦袋不好。 –

回答

3

只是爲了解釋該部分,其中,它給你的Array

首先,scandir返回如下:

返回文件和目錄的數組從目錄。

從這個返回值,它返回這個(這是一個例子,以供參考):

Array 
(
    [0] => . // current directory 
    [1] => .. // parent directory 
    [2] => imgo.jpg 
    [3] => logo.png 
    [4] => picture1.png 
    [5] => picture2.png 
    [6] => picture3.png 
    [7] => picture4.png 
) 

這些點在那裏實際上是文件夾。現在在你的代碼的邏輯,當它擊中/遍歷這個地方:

if(is_dir($x))$ar[$x]=scandir($x); // if its a directory 
// invoke another set of scandir into this directory, then append it into the array 

這就是爲什麼你的合成數組混合字符串,而另一個額外的/不需要scandir陣列回報從..

值髒快修復可以用來避免這些。只跳過點:

foreach($g as $x) 
{ 
    // skip the dots 
    if(in_array($x, array('..', '.'))) continue; 
    if(is_dir($x))$ar[$x]=scandir($x); 
    else 
    { 
     $count++; 
     $ar[]=$x; 
    } 
} 

另一種替代方法是使用DirectoryIterator

$path = './images/'; 
$files = new DirectoryIterator($path); 
$ar = array(); 
foreach($files as $file) { 
    if(!$file->isDot()) { 
     // if its not a directory 
     $ar[] = $file->getFilename(); 
    } 
} 

echo '<pre>', print_r($ar, 1); 
+0

非常感謝。而已。其他的貢獻者可能對他們的建議是正確的,但我需要知道這裏發生了什麼,而你的回答總是讓人感覺到。 – Baylock

+0

@Baylock當然很高興,這灑了一些燈 – Ghost

+0

@Ghost:糾正我,如果我錯了;使用這些方法的唯一缺點是如果您想包含可能位於路徑中的目錄。 –