Листинг папки с записью в массив

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, мне лучше свой smile он ничем не уступает в принципе, сравни мой и способ "Студента_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'); smile
Вот и слились оупэндир и глоб воедино. Гг

URL: https://visavi.net/topics/12176