Переменная в рекурсивной функции ведет себя как глобальная - PullRequest
1 голос
/ 02 декабря 2011

У меня есть рекурсивная функция, которая должна печатать содержимое каталога.Вот код

function dirs($dir, $tab) {
    $d = opendir($dir);
        while ( ($name = readdir($d)) !== false ) {
            if ( $name == "." or $name == ".." ) continue;
            if ( is_dir($dir . '/' . $name) ) {
                echo "<b>" . $tab . "[$name]</b><br>";
                $tab .= "-";
                dirs($dir . '/' . $name, $tab);
            }
            else {
                echo $tab . $name . '<br>';
            }
        }
        closedir($d);
}
dirs("C:/php5", "");

Выходные данные для этой функции будут выглядеть так ([extras] пустая директота):

[dev]
-php5ts.lib
-[ext]
--php_bz2.dll
--php_curl.dll
--php_enchant.dll
--php_exif.dll
--etc.
--[extras]
---glib-2.dll
---gmodule-2.dll
---icudt.dll
---icudt46.dll
---icuin.dll
---etc.

, но не так

[dev]
-php5ts.lib
[ext]
-php_bz2.dll
-php_curl.dll
-php_enchant.dll
-php_exif.dll
-etc.
[extras]
glib-2.dll
gmodule-2.dll
icudt.dll
icudt46.dll
etc.

Вопрос в том, почему «$ tab» ведет себя как глобальная переменная, а не как локальная?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Проблема в том, что вы фактически заново присваиваете значение локальной копии $tab, тогда как на самом деле вы хотите передать $tab.'.' на следующую итерацию.

Поскольку вы переназначили его, он будет иметь новое значение во внешней итерации после выполнения внутренней итерации.

Изменение:

$tab .= "-";
dirs($dir . '/' . $name, $tab);

просто:

dirs($dir . '/' . $name, $tab . '-');
0 голосов
/ 02 декабря 2011

Вы передаете $ tab функции, и нет ничего для повторной инициализации $ tab, поэтому каждый раз, когда она проходит, она выбирает новый "-".

Вам нужно каждый раз удалять "-"Вы завершаете содержание каталога.

Вместо добавления "-", я рекомендую вам отслеживать уровни с целым числом и использовать целое число, чтобы добавить необходимое число "-".


Записать,Ответ от DaveRandom намного проще.

...