Как избавиться от. и .. при сканировании папки создавая массив в php? - PullRequest
2 голосов
/ 10 февраля 2009

Если вы сканируете папку, содержащую другие папки и файлы, как от нее избавиться. и .. а файлы? Как вы кладете в массив только папки БЕЗ. а также ..? Я хотел бы использовать регулярные выражения, но я новичок, и я не могу понять это правильно. Мой код сейчас такой, но не работает:

if (fnmatch ("\. {1,2}", $ dir_array [$ i]) || is_file ($ dir_array [$ i]) {
снята с охраны ($ dir_array [$ я]);
} Еще { // другой код
}

Ответы [ 7 ]

9 голосов
/ 10 февраля 2009

Вы путаете 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 вы можете исключительно <a href="http://php.net/manual/en/function.array-filter.php" rel="nofollow noreferrer"> использовать функцию обратного вызова , также:

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

(См. Ответ Аллена Лалонда для более подробной версии)

Начиная с php 5.3, это можно записать лучше :

$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);
1 голос
/ 10 февраля 2009

регулярное выражение не требуется, просто unset () первые два значения.

$d = dir($dir);
unset($d[0]);
unset($d[1]);
1 голос
/ 10 февраля 2009

Это может сделать это.

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 голос
/ 10 февраля 2009

Вам не нужно регулярное выражение, чтобы проверить это. Просто используйте сравнение строк:

if ($dir_array[$i] == '.' || $dir_array[$i] == '..' || is_file($dir_array[$i])) {
    unset($dir_array[$i]);
}
0 голосов
/ 14 февраля 2013
        $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);
0 голосов
/ 10 февраля 2009

Я бы сделал что-то вроде этого (код может не работать без усилий, так как я не работал в 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. 
      }
    }
  }
?>

РЕДАКТИРОВАТЬ неправильно прочитанный вопрос - теперь это должно добавить в массив все имена папок, которые не являются "." или ".."

0 голосов
/ 10 февраля 2009

Я бы сделал это так:

$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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...