За последние 24 часа нас посетили 35344 программиста и 1814 роботов. Сейчас ищут 903 программиста ...

Подсчитать кол-во файлов в директории и поддиректориях

Тема в разделе "PHP для новичков", создана пользователем rafaello, 26 июл 2015.

  1. rafaello

    rafaello Активный пользователь

    С нами с:
    5 сен 2014
    Сообщения:
    17
    Симпатии:
    0
    Доброго дня! Есть задача подсчитать количество файлов в директории и в поддиректориях. Я соорудил следующее, но что-то мне кажется, что запутался в трех соснах:
    Код (PHP):
    1. $dir = '/tmp'
    2.     function count_files($dir){
    3.     $files1 = scandir($dir);
    4.     if($i){$i = $i;}else{$i = 0;}
    5.     foreach ($files1 as $key => $value){
    6.     if (!in_array($value, array(".", ".."))){
    7.         if(is_file($dir.'/'.$value)){$i = $i + 1;}
    8.         if(is_dir($dir.'/'.$value)){count_files($dir.'/'.$value);}
    9.     } 
    10.     }
    11.     return $i;
    12.     }
    13.     echo count_files($dir);
    14.  
    так выдает 0.
    как же правильно посчитать? Спасибо!

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
  3. rafaello

    rafaello Активный пользователь

    С нами с:
    5 сен 2014
    Сообщения:
    17
    Симпатии:
    0
    и куда это прилепить?
     
  4. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    Индуизм?? :))
     
  5. rafaello

    rafaello Активный пользователь

    С нами с:
    5 сен 2014
    Сообщения:
    17
    Симпатии:
    0
    Вот всегда так, думают, что новичок соображает на том же уровне, что и форумчане.... Нет чтобы просто подсказать, по нормальному...
    Вставлял я так:
    Код (Text):
    1. //if($i){$i = $i;}else{$i = 0;}
    2. ++$i;
    и так
    Код (Text):
    1. $i=0;
    все равно правильно не считает...
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну так $i у тебя локальная переменная, вот она и не сохраняется между рекурсивными вызовами. Попробуй возвращаемое значение к ней плюсовать
    Код (PHP):
    1. function count_files($dir){
    2.     $files1 = scandir($dir);
    3.     $i = 0;
    4.     foreach ($files1 as $key => $value){
    5.         if (!in_array($value, array(".", ".."))){
    6.             if(is_file($dir.'/'.$value)){$i = $i + 1;}
    7.             if(is_dir($dir.'/'.$value)){$i += count_files($dir.'/'.$value);}
    8.          } 
    9.     }
    10.     return $i;
    11.     }
    12.  
    От новичка ожидается, что он сначала с базовыми понятиями ознакомится, но видимо напрасно... Всё-таки в который раз убеждаюсь, что нельзя первым языком учить PHP, думать совсем не приучает... На форумах по Pascal или C настолько незнания основ программирования не встречается.
     
  7. rafaello

    rafaello Активный пользователь

    С нами с:
    5 сен 2014
    Сообщения:
    17
    Симпатии:
    0
    Премного благодарен, господин mkramer!
    Пусть вам сопутствует удача во всех ваших делах!
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ты хоть понял, почему у меня работает, а у тебя нет?
     
  9. rafaello

    rafaello Активный пользователь

    С нами с:
    5 сен 2014
    Сообщения:
    17
    Симпатии:
    0
    Да, я понял. При итерации (повторе) функции count_files переменная $i не сохраняется, так как она локальная. Поэтому она не суммировалась. А когда мы (то есть вы) влепили эту переменную до начала итерации функции, то она стала суммироваться....
    Ура!!!
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не совсем.

    Переменная $i находится в стеке вызовов, поэтому не при каждой итерации, а при каждом вызове она создаётся по новой, а потом уничтожается. То есть сколько вызовов, столько переменных $i. Вы же пытались с ней работать, как будто она одна (кстати, так тоже можно было написать эту функцию, используя глобальные переменный или статические локальные, но мне так не нравится). Я же после каждого рекурсивного вызова прибавляю количество файлов, найденных в поддиректории к текущему. Соответственно, к примеру
    Код (Text):
    1.  
    2. folder 1 --- count_files("folder1") $i =0
    3.     file1 count_files("folder1") $i = 1
    4.     folder2 count_files("folder2") $i = 0
    5.         file2 count_files("folder2") $i =1
    6.         file3 count_files("folder2") $i =2
    7.         count_files("folder2") return 2
    8.    $i = (count_files("folder1") $i) + count_files("folder2") = 1 + 2 = 3
    9.    count_files("folder1")  return 3
    Надеюсь, схема понятна
     
  11. rafaello

    rafaello Активный пользователь

    С нами с:
    5 сен 2014
    Сообщения:
    17
    Симпатии:
    0
    Спасибо, я понял!