Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> организация меню с помощью readdir 
V
    Опции темы
kat_ru
Дата 16.1.2007, 04:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

Репутация: нет
Всего: нет



Это смешно, но тем не меннее хотелось бы услышать рекомендации по реализации оптимизации, ну а если вообще надо переписывать то пожалуйста объясните как реализовать.

Код

            $dir = "folder/";
            $dh  = opendir($dir);
        while (false !== ($filename = readdir($dh)))
    {
       $files[] = $filename;
    }
                foreach($files as $key => $cat)
            {
                if($cat != '.' and $cat != '..')
                print'<a class=primary_text href=index.php?menu=genmenu&cat='.$cat.'>'.$cat.'</a><br>';
            }
        
        if(isset($_GET['cat']))
    {
        $dir2 = "folder/".$_GET['cat']."/";
        $dh2  = opendir($dir2);
                while (false !== ($filename2 = readdir($dh2)))
            {
               $files2[] = $filename2;
            }
        print'<font class=body_text>Вы выбрали категорию: '.$_GET['cat'].'</font><br /.>';
            foreach($files2 as $key2 => $name)
        {
                if($name != '.' and $name != '..')
            {
                print'<a class=primary_text href=index.php?menu=genmenu&cat='.$_GET['cat'].'&name='.$name.'>'.$name.'</a><br>';
            }
        }
    }


заранее благодарю.

Это сообщение отредактировал(а) kat_ru - 16.1.2007, 04:48
PM MAIL   Вверх
IvanB
Дата 16.1.2007, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: 2
Всего: 5



Цитата(kat_ru @  16.1.2007,  04:35 Найти цитируемый пост)
        while (false !== ($filename = readdir($dh)))
    {
       $files[] = $filename;
    }
                foreach($files as $key => $cat)
            {
                if($cat != '.' and $cat != '..')
                print'<a class=primary_text href=index.php?menu=genmenu&cat='.$cat.'>'.$cat.'</a><br>';
            }

Для начала - самое простое.
Зачем два цикла-то прогоняешь?)
Здесь то же самое: 
Цитата

                while (false !== ($filename2 = readdir($dh2)))
            {
               $files2[] = $filename2;
            }
        print'<font class=body_text>Вы выбрали категорию: '.$_GET['cat'].'</font><br /.>';
            foreach($files2 as $key2 => $name)
        {
                if($name != '.' and $name != '..')
            {
                print'<a class=primary_text href=index.php?menu=genmenu&cat='.$_GET['cat'].'&name='.$name.'>'.$name.'</a><br>';
            }
        }

Также насчёт оптимизации: 
Цитата

 $files[] = $filename;

Если используешь массив $files только для того, чтобы отобразить информацию о содержимом директории, то незачем хранить в этом массиве весь список. Достаточн (Точнее одного массива из двух элементов).
Насчёт $files2 то же самое.

Могу, если не понятно, написать код smile

P.s. Тебе, кстати, так (как у тебя написано) удобно просматривать содержимое директорий? smile

Это сообщение отредактировал(а) IvanB - 16.1.2007, 10:25
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
Mal Hack
Дата 16.1.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Это смешно, но тем не менее, хотелось бы услышать словами поставленную задачу...
PM ICQ   Вверх
kat_ru
Дата 16.1.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

Репутация: нет
Всего: нет



Цитата(IvanB @  16.1.2007,  07:55 Найти цитируемый пост)
Могу, если не понятно, написать код 

Если не затруднит  smile 
Цитата(IvanB @  16.1.2007,  07:55 Найти цитируемый пост)
P.s. Тебе, кстати, так (как у тебя написано) удобно просматривать содержимое директорий? 

А какие способы можно ещё использовать?


Цитата(Mal Hack @  16.1.2007,  13:23 Найти цитируемый пост)
Это смешно, но тем не менее, хотелось бы услышать словами поставленную задачу... 

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

  foto
    . girl
    . boy
  news
    . today
    . yesterday

Результатом должно быть:

Категории: 
foto
news

при нажатии, выборе или ещё чего одной из категорий должны высветиться подкаталоги (подкатегории)

PM MAIL   Вверх
Mal Hack
Дата 16.1.2007, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Есть у меня класс файлового менеджера...
Написал решение, об оптимальности не думал.
Код

<pre><?php

function dirsize( $d,$level,$p )
 {
  $dh = opendir( $d );
         $level++;


  while( ( $f = readdir( $dh ) ) !== false )
  {
    if ( $f != "." && $f != ".." )
    {
        $path = $d . "/" . $f;

       if( is_dir( $path ) )
        {
         $r = $p."/".$f;
         print str_repeat( "...." , $level ) . "<a href='?dir={$r}'>{$f}</a><br/>";
         dirsize($path,$level,$p."/".$r);
        }
     }
   }

  closedir($dh);
  return $size;
 }

$path = (isset($_GET['dir']))?preg_replace( "#(\.\.|\.)/#" , "" , $_GET['dir']):"";
dirsize("d:/home/mal-hack/{$path}",0,"/")

?>

PM ICQ   Вверх
IvanB
Дата 17.1.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: 2
Всего: 5



Ну.... А если как kat_ru просит, то:
Код

  $dir = "folder/";
  $isNotRight=!isset($_GET['cat']);
  if ($dh  = opendir($dir)) {
    while (false !== ($filename = readdir($dh)))  {
      if (($filename!=".")&&($filename!="..")) {
        if ($isNotRight) {
          print '<a class=primary_text href=index.php?menu=genmenu&cat='.$filename.'>'.$filename.'</a><br>\n';
        } else {
          print '<a class=primary_text>'.$filename.'</a><br>\n';
          $dir=$dir.$_GET['cat']."/";
          $dh2  = opendir($dir2);
          while (false !== ($filename=readdir($dh2))) {
            if (($filename!=".")&&($filename!="..")) {
              print '&nbsp; '.$filename."<br>\n";
            }
          }
        }
      }
    }
  }

Это для того же каталога, что и у тебя....
Вроде так.... Сам не тестировал  smile 

Конечно, лучше сделать в общем виде, как у Mal Hack.  smile 
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
Glip
Дата 17.1.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18



а если чуть короче записать while? или есть подводные ками?
Код

while($f = readdir($dh)) {
......
}



--------------------
user posted image
PM MAIL   Вверх
Mal Hack
Дата 17.1.2007, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Уж хотя бы напиши как IvanB сказал.
PM ICQ   Вверх
IvanB
Дата 17.1.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: 2
Всего: 5



Цитата(Glip @  17.1.2007,  13:58 Найти цитируемый пост)
а если чуть короче записать while? или есть подводные ками?

while($f = readdir($dh)) {
......
}
Читаем в manual-е по функции readdir:
Цитата

Обратите внимание на способ проверки значения, возвращаемого функцией readdir() в приведенном ниже примере. В этом примере осуществляется проверка значения на идентичность (выражения идентичны, когда они равны и являются значениями одного типа - за более подробной информацией обратитесь к главе Операторы сравнения) значению FALSE, поскольку в ином случае, любой элемент каталога, чье имя может быть выражено как FALSE, остановит цикл (например, элемент с именем "0"). 

В коде: 
Цитата

while (false !== ($file = readdir($handle))) { 
        echo "$file\n";
    }



Это сообщение отредактировал(а) IvanB - 17.1.2007, 15:20
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
kat_ru
Дата 17.1.2007, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

Репутация: нет
Всего: нет



Цитата(Mal Hack @ 16.1.2007,  17:23)
Есть у меня класс файлового менеджера...
Написал решение, об оптимальности не думал.
Код

      ^
      |
смотрим выше =)

Я считаю что так будет более правельно, объясняю:
если открываем каталог с уровнем 1, то последующие не откроешь... так как путь сбился... кстати а что за return $size?  smile 

Код

<?php
function dirsize( $d,$level,$p )
{
    $dh = opendir( $d );
        $level++;
        while( ( $f = readdir( $dh ) ) !== false )
    {
            if ( $f != "." && $f != ".." )
        {
            $path = $d . "/" . $f;
               if( is_dir( $path ) )
            {
                 $r = $p."/".$f;
                     if($level == '1'){print $f;}
                     else
                {
                     print str_repeat( "...." , $level ) . "<a href='?dir={$r}'>{$f}</a><br/>";
                }
                     dirsize($path,$level,$p."/".$r);
            }
        }
    }

  closedir($dh);
}
$path = (isset($_GET['dir']))?preg_replace( "#(\.\.|\.)/#" , "" , $_GET['dir']):"";
dirsize("templates/{$path}",0,"/")
?>

Блин smile я тож лопухнулся, всё равно открываешь любой каталог и следующий не откроешь... smile надо, что бы $_GET складывался smile хотя это не сложно переделать...


А так СПАСИБО Большое... Ибо направели... smile

Это тоже самое, только пару строк изменилось, а и кстати а как это понять и как строить я просто такого не знаю...
Цитата

Код

$path = [U](isset($_GET['dir']))?preg_replace( "#(\.\.|\.)/#" , "" , $_GET['dir']):"";[/U]
dirsize("templates/[U]{$path}[/U]",0,"/")




Это сообщение отредактировал(а) kat_ru - 17.1.2007, 21:32
PM MAIL   Вверх
Mal Hack
Дата 17.1.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Цитата(kat_ru @  17.1.2007,  21:21 Найти цитируемый пост)
если открываем каталог с уровнем 1, то последующие не откроешь...

Ну подправишь уже smile

Цитата(kat_ru @  17.1.2007,  21:21 Найти цитируемый пост)
кстати а что за return $size?  smile 

Это все происки империалистов. Осталось от старого кода.


Цитата(kat_ru @  17.1.2007,  21:21 Найти цитируемый пост)
Это тоже самое, только пару строк изменилось, а и кстати а как это понять и как строить я просто такого не знаю...

http://www.php.net/manual/en/language.expressions.php
PM ICQ   Вверх
kat_ru
Дата 17.1.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

Репутация: нет
Всего: нет



Спасибо =) блин ну и загрузило  smile...
PM MAIL   Вверх
Glip
Дата 17.1.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18



можно еще тут посмотреть
http://ru.php.net/manual/en/ref.spl.php
DirectoryIterator



--------------------
user posted image
PM MAIL   Вверх
kat_ru
Дата 18.1.2007, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

Репутация: нет
Всего: нет



прикольно! Спасибо всем вопрос я думаю решён smile для меня покрайней мере smile...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1230 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.