Листинг папки с записью в массив
1.
KOZZ (01.08.2010 / 19:31)
нужна немного необычная функция листинга директории.
надо чтоб работала так:
1) открываю директорию, считываю названия всех файлов / папок
2)если папка - делаю массив с ключом [название папки]=> и значениями array(файл1,файл2,файл3)
------------------
результат должен быть таким:
содержимое папок:
папка1:
> файл1.мп3
> файл2.мп3
> папка2:
>>файл3.мп3
>>файл4.мп3
array(['папка1']=>array([0]=>'файл1.мп3',[1]=>'файл2.мп3',['папка2']=>array([0]=>'файл3.мп3',[1]=>'файл4.мп3')))
------------------
делаю так:
<?
function list_dir ($url) {
$i = 0;
$dir = opendir($url);
while (false !== ($file = readdir($dir))) {
if(($file !='.') && ($file !='..')) {
$file = iconv('cp1251','utf-8',$file);
if(is_dir("$url/$file")){$outp[$file] = list_dir("$url/$file");} elseif(is_file("$url/$file")){
$outp[] = $file;}
$i++;
}
}
closedir($dir);
return $outp;
}
?>
только почему то в массив входят не все файлы
2.
KOZZ (01.08.2010 / 19:37)
а оказывается все было так просто...
надо было вместо elseif вставить else,т.к. иначе сбивался счетчик
<?
function list_dir ($url) {
$i = 0;
$dir = opendir($url);
while (false !== ($file = readdir($dir))) {
if(($file !='.') && ($file !='..')) {
$file = iconv('cp1251','utf-8',$file);
if(is_dir("$url/$file")){$outp[$file] = list_dir("$url/$file");} else{
$outp[] = $file;}
$i++;
}
}
closedir($dir);
return $outp;
}
?>
3.
Studentsov (01.08.2010 / 19:54)
<?php
function list_dir ($url) {
static $outp;
static $i;
if (empty ($outp)) $outp = array ();
if (empty ($i)) $i = 0;
$files = glob ($url . '/*');
if (is_array ($files)) {
foreach ($files as $file) {
# На *nix и Linux нужно указывать koi8-u
$file = iconv ('windows-1251', 'utf-8', $file);
if (is_dir ($url . '/' . $file)) $outp[$file] = list_dir ($url . '/' . $file);
else $outp[] = $file;
++$i; }}
return $outp; }
?>
4.
KOZZ (01.08.2010 / 20:02)
3, я думал сделать это примерно как ты,через foreach и glob, но остановился на своем варианте, удобнее, да и привычнее чтоли ))
перекодировка нужна была чтоб на денвере тестить
ну а конкретно твой вариант возвращает немного не то что надо ))
вот какой результат мне нужен был:
http://upwap.ru/974466
5.
KOZZ (01.08.2010 / 20:12)
3, спасибо что не остался равнодушным ;)
6.
KOZZ (01.08.2010 / 20:29)
кстати почитал про то что быстрее: glob() или opendir().
быстрее opendir().
источник:
http://code2design.com/forums/glob_vs_opendir
"The result was:
0.0069890022277832 (opendir time)
0.027945041656494 (glob time)"
7.
Артур (02.08.2010 / 01:46)
1,
http://ua.php.net/manual/en/class.recursivedirectoryiterator.php
8.
KOZZ (02.08.2010 / 04:43)
7,спасибо, но не очень я классы люблю.
9.
Azzido (02.08.2010 / 08:13)
6, этот пример - фигня, обрати внимание, что там цикл из 20 итераций, и 0.02 для этого очень даже неплохо, обычно же применяется всего одна функция glob и время выполнения совсем незначительно
10.
KOZZ (02.08.2010 / 08:37)
9, мне лучше свой
он ничем не уступает в принципе, сравни мой и способ "Студента_trollface" в действии - его способ еще дорабатывать до нужного мне результата, а разницы ощутимой я не вижу, так что смысла нет.
11.
Azzido (02.08.2010 / 09:29)
не, ну я конкретно про сравнение glob() и opendir()
12.
KOZZ (02.08.2010 / 10:26)
Azzido (2 Августа 2010 / 16:29)
не, ну я конкретно про сравнение glob() и opendir()
а, ну ясно тогда )
13.
Вантуз-мен (02.08.2010 / 11:47)
6.
eGo, если честно не совсем точный тест, почему-то в первом варианте в opendir идет выборка всех файлов из папки, а в glob с применением фильтра html
если убрать это то glob на php 5.3.3 выигрывает в 2 раза
во-втором тесте у меня такие результаты
0.0045804977417 explode
0.00842428207397 preg
0.00366401672363 glob
14.
Studentsov (02.08.2010 / 12:40)
Да без разницы, одно и тоже
15.
Артур (02.08.2010 / 15:41)
На сколько я помню, в пхп 5.3 можно так
$arr = scandir('glob://полный_путь/*.html');
Вот и слились оупэндир и глоб воедино. Гг
URL:
https://visavi.net/topics/12176