2009-02-10 19 views
2

如果您掃描包含其他文件夾和文件的文件夾,您將如何擺脫。和..和文件?你如何只將數組放入文件夾WITHOUT中。和..? 我想用正則表達式,但我是新手,我不能正確表達。 現在我的代碼是這樣的,但不起作用:如何擺脫。和..當掃描文件夾在PHP中創建一個數組?

如果(的fnmatch( 「\ {1,2}」,$ dir_array [$ i])|| is_file($ dir_array [$ i]) {
未設置($ dir_array [$ i]);
}其他{// 其他代碼
}

回答

9

你感到困惑的fnmatch和正則表達式在你的代碼來獲取所有文件和目錄之外。特殊的,使用這個:

$dir_array = array_diff($dir_array, array(".", "..")); 

或者,如果無論如何迭代陣列,可以測試每個元件是這樣的:

foreach ($dir_array as $name) { 
    if (($name != "..") && ($name != ".")) { 
     // Do stuff on all files and directories except . .. 
     if (is_dir($name)) { 
      // Do stuff on directories only 
     } 
    } 
} 

在PHP < 5.3,可以排他地use a callback function,也:

$dir_array = array_filter($dir_array, 
    create_function('$n', 'return $n != "." && $n != ".." && is_dir($n);')); 

(參見阿蘭Lalonde的答案爲更詳細的版本)

由於php 5.3,這可以寫爲nicer

$dir_array = array_filter($dir_array, 
    function($n) {return $n != "." && $n != ".." && is_dir($n);}); 

最後,結合array_filter和這個答案的第一行代碼產生的(不顯着),速度較慢,但​​可能更可讀的版本:

$dir_array = array_filter(array_diff($dir_array, array(".", "..")), is_dir); 
+0

我不是這個意思。和..是文件,我只想從陣列中刪除這些目錄以及可能的文件。但我喜歡你如何使用array_diff。謝謝 – Adriana 2009-02-11 15:48:14

+0

糟糕,我的壞。對不起,在重讀時,我無法理解爲什麼我這樣寫。我會更新答案。 – phihag 2009-02-11 17:20:45

1

你並不需要一個正則表達式來測試這個。只需使用普通字符串比較:

if ($dir_array[$i] == '.' || $dir_array[$i] == '..' || is_file($dir_array[$i])) { 
    unset($dir_array[$i]); 
} 
1

這可以做到。

function is_not_meta_dir($file_name) { 
    // return true if $filename matches some pattern. 
    // without knowing the format of your $dir_array 
    return $file_name != '.' && $file_name != '..'; 
} 

$new_dir_array = array_filter($dir_array, 'is_not_meta_dir'); 
+1

看起來像lambda ... uhmmm .. create_function可以美化代碼。無論如何,你應該在$ filename和$ file_name之間做出決定;) – phihag 2009-02-10 17:05:15

0

我會做這樣的:

$items = array(); 
$handle = opendir('path/to/dir'); 
while (($item = readdir($handle)) !== false) { 
    if (! in_array($item, array('.', '..'))) { 
     $items[] = $item; 
    } 
} 
closedir($handle); 

print_r($items); 

雖然,我寧願喜歡DirectoryFilterDots但它是在現有的PHP發行一種罕見。

0

我會做這樣的事情(因爲我沒有在PHP工作多年的代碼可能不是沒有努力工作)

<? 
if ($handle = opendir('/myPath')) 
    { 
    while (false !== ($file = readdir($handle))) 
    { 
    if (bool is_dir ($file) && substring($file,0,1) != ".") 
     { 
     $filesArray[] = $file; // this is the bit I'm not sure of the syntax for. 
     } 
    } 
    } 
?> 

編輯誤解了問題 - 這現在應該添加到陣列所有不屬於「。」的myPath文件夾名稱或「..」

1

不需要正則表達式,只需取消設置()前兩個值。

$d = dir($dir); 
unset($d[0]); 
unset($d[1]); 
0
 $pathsArr = array(); 
    foreach (explode($dirSeparator, $currentPath) as $path) { 
     if (strlen($path) && $path !== '.') { 
      if ($path === '..') { 
       // die('.....'); 
       array_pop($pathsArr); 
      } else { 
       $pathsArr[] = $path; 
      } 
     } 
    } 

    $realpath = $winDrive . $dirSeparator . implode($dirSeparator, $pathsArr); 
相關問題