За последние 24 часа нас посетили 17726 программистов и 1607 роботов. Сейчас ищут 1068 программистов ...

Сделать массив глобальным

Тема в разделе "PHP для новичков", создана пользователем Qwe1, 1 дек 2007.

  1. Qwe1

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

    С нами с:
    1 дек 2007
    Сообщения:
    10
    Симпатии:
    0
    Вот у меня есть index.php и папка news, в которой расположен подключаемый файл, считывающий файлы (новости) из подпапки bdnews. Предупреждений и ошибок нет, но global не срабатывает, то есть функция ViewNNews работает с неопределенным массивом listOfFileName, хотя он был сделан глобальной переменной. Почему так?

    index.php
    PHP:
    1.  
    2. <?
    3.  include("http://".$_SERVER['SERVER_NAME']."/news/newsf.h");
    4.  
    5.  $newsExist = GetAllNewsFiles();
    6.  if($newsExist)
    7.  {
    8.    // Новость 1
    9.    ViewNNews(0, 0);
    10.    ViewNNews(0, 1);
    11.  
    12.    // Новость 2
    13.    ViewNNews(1, 0);
    14.    ViewNNews(1, 1);
    15.  }
    16.  else
    17.    echo "Новостей нет!";
    18.  ?>
    19.  
    news/newsf.h
    PHP:
    1.  
    2. <?
    3.  function GetAllNewsFiles()
    4.  {
    5.    global $listOfFileName;
    6.    if($handle = opendir("news/bdnews"))
    7.    {
    8.      while(($file = readdir($handle)) !== false)
    9.      {
    10.        if(($file != ".") && ($file != ".."))
    11.          $listOfFileName[] = $file;
    12.      }
    13.      closedir($handle);
    14.      if(count($listOfFileName))
    15.        rsort($listOfFileName);
    16.      else
    17.        return 0;
    18.    }
    19.    else
    20.      return 0;
    21.  
    22.    return 1;
    23.  }
    24.  
    25.  function ViewNNews($n, $what)
    26.  {
    27.    if(isset($listOfFileName[0]))
    28.    {
    29.      if($n < count($listOfFileName))
    30.      {
    31.        if($newsFile = file("http://".$_SERVER['SERVER_NAME']."/news/bdnews/".$listOfFileName[$n]))
    32.        {
    33.          if($what == 0)
    34.            echo $newsFile[0];
    35.          if($what == 1)
    36.            echo $newsFile[1];
    37.        }
    38.      }
    39.    }
    40.  }
    41.  ?>
    42.  
    [/php]
     
  2. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Qwe1
    В функции ViewNNews тоже нужно объявить массив $listOfFileName глобальным.
     
  3. Qwe1

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

    С нами с:
    1 дек 2007
    Сообщения:
    10
    Симпатии:
    0
    1) Спасибо! Все заработало! И еще вопрос: нужна ли проверка на существование массива if(isset($listOfFileName[0])) и правильно ли так делать?

    2) Я в файле index.php вызываю функцию GetAllNewsFiles() и открываю директорию для получения списка фалов (opendir("news/bdnews"))) - но если вызвать эту же функцию, к примеру, из скрипта в самой папке "news", то путь открытия окажется не верным (надо указать просто "bdnews"). А можно задать абсолютный путь для функции opendir() или как обойти эту проблему?
     
  4. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Qwe1
    1) Я бы сделал так, чтобы GetAllNewsFiles() возвращала список новостей как результат, и передавал бы полученный массив в ViewNNews() как параметр. Тогда глобальные переменные были бы не нужны. В качестве флага "есть новости - нет новостей" прекрасно справится count().
    2) Можно написать $_SERVER["DOCUMENT_ROOT"] . "/news/bdnews"
     
  5. Qwe1

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

    С нами с:
    1 дек 2007
    Сообщения:
    10
    Симпатии:
    0
    1) Честно говоря, я так и хотел вначале сделать. Если этот вариант наиболее правильный, то я именно его и выберу!
    2) Точно!
    Таким образом, получаем:

    index.php:
    PHP:
    1.  
    2. <?
    3. include("http://".$_SERVER['SERVER_NAME']."/news/newsf.h");
    4.  
    5. $listOfFileName = GetAllNewsFiles();
    6. if(count($listOfFileName))
    7. {
    8.   // Новость 1
    9.   ViewNNews($listOfFileName, 0, "time");
    10.   ViewNNews($listOfFileName, 0, "text");
    11.  
    12.   // Новость 2
    13.   ViewNNews($listOfFileName, 1, "time");
    14.   ViewNNews($listOfFileName, 1, "text");
    15. }
    16. else
    17.   echo "Новостей нет!";
    18. ?>
    19.  
    news/newsf.h:
    PHP:
    1.  
    2. <?
    3. function GetAllNewsFiles()
    4. {
    5.   $listOfFileName = array();
    6.   if($handle = opendir($_SERVER["DOCUMENT_ROOT"]."/news/bdnews"))
    7.   {
    8.     while(($file = readdir($handle)) !== false)
    9.     {
    10.       if(($file != ".") && ($file != ".."))
    11.         $listOfFileName[] = $file;
    12.     }
    13.     closedir($handle);
    14.     if(count($listOfFileName))
    15.       rsort($listOfFileName);
    16.   }
    17.  
    18.   return $listOfFileName;
    19. }
    20.  
    21. function ViewNNews($listOfFileName, $n, $what)
    22. {
    23.   if(count($listOfFileName))
    24.   {
    25.     if($n < count($listOfFileName))
    26.     {
    27.       if($newsFile = file("http://".$_SERVER['SERVER_NAME']."/news/bdnews/".$listOfFileName[$n]))
    28.       {
    29.         if(!strcmp("time", $what))
    30.           echo $newsFile[0]."<br>";
    31.         if(!strcmp("text", $what))
    32.           echo $newsFile[1]."<br>";
    33.       }
    34.     }
    35.   }
    36. }
    37. ?>
    38.  
     
  6. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Qwe1
    Молодец :)
    Одно замечание - file("http://...") приведет не к чтению файла, а к выполнению вспомогательного HTTP-запроса. Это повышает нагрузку на сервер, возможно, стоит скормить функции file() то же самое, что и opendir(). То же самое с include() в начале кода.
     
  7. Qwe1

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

    С нами с:
    1 дек 2007
    Сообщения:
    10
    Симпатии:
    0
    Заменил 26-ю строку файла "news/newsf.h": теперь она выглядит так: (все работает!)
    PHP:
    1.  
    2. if($newsFile = file($_SERVER["DOCUMENT_ROOT"]."/news/bdnews/".$listOfFileName[$n]))
    3.  
    А на счет подключения файла (include) - можно аналогичным образом поступить! Если предложенный способ действительно более правильный (с точки зрения скорости работы), то я так и сделаю!

    Спасибо, Dagdamor!