Autor Zpráva
Blitz
Profil *
Ahoj,
rád bych vás požádal o pomoc, potřebuju vypisování souborů, kde si můžu vybrat, které soubory se nevypíší ("systémové").
Mám vypisování souborů tedy tímto způsobem:
function GetDirArray($sPath,&$ret,&$dir)
{
   global $time0, $MAXTIME, $timeover;
   if ((time()-$time0)>$MAXTIME) { $timeover = 1; return; }
   $handle=opendir($sPath);
   while ($file = readdir($handle))
   {
      $polozky[count($polozky)] = $file;
   }
   closedir($handle); 
   sort($polozky);

   while (list($key, $val) = each($polozky))
   {
      if ($val != "." && $val != "..")
      { 
         $path = str_replace("//","/",$sPath.$val);
         $path2 = substr($path,2);
         $ret[count($ret)] = $path2;
         if (is_dir($sPath."/".$val))
         {
            $dir[count($dir)] = 1;
            GetDirArray($sPath."/".$val."/",$ret,$dir);
         }
         else
         {
            $dir[count($dir)] = 0;
         }
      }
   }
}
$MAXTIME = 60;
$time0 = time();
$timeover = 0;
$cwd = getcwd();
//echo "<font color=\"#808080\">Adresář \"$cwd\"</font>";
GetDirArray("./",$ret,$dir);
if ($timeover)
{
   echo "Provadeni skriptu preruseno,";
   echo "uplynul maximalni povoleny cas ($MAXTIME sek.)<br><br>\n";
}
while (list($key, $isdir) = each($dir))
{
   list($key, $file) = each($ret);
   if($isdir==1)
   {
      echo "(DIR) <a href=\"$file\">$file</a><br>\n";
   }
}
echo "\n";
reset($dir);
reset($ret);
while (list($key, $file) = each($ret))
{
   list($key, $isdir) = each($dir);
   if($isdir==0)
   {
   //dále je echo, napsal jsem jen začátek kódu, protože dále nic důležitého není

Lze to nějak udělat? Mockrát děkuji za námahu, stačilo by jenom nějaké nakopnutí, dodělám to sám :-)
Jozin
Profil
Zdravím,

asi úplně nechápu důvod tolika cyklů. Již v prvním cyklu je možné zpracovávat data, jako je v druhém cyklu. Navíc, pokud chceš přidat pole, tak se to nedělá $pole[count($pole)], ale $pole[], zbytečně to počítá počet polí. Dále by ta funkce měla vracet ten seznam souborů. Tudíž ti tam někde chybí return.

K tvému "problému", do parametrů funkce přidej array $ignored_file. Při ukládání souborů do proměnné dáš jednoduchou podmínku if(!in_array($ten_soubor, $ignored_file)) //vloz do promenne soubor.

Snad jsem trochu pomohl, Jozin.
Blitz
Profil *
Jozin:
No, důvodem bylo to, že tento skript, umí procházet adresáře s tím, že je jen jeden. Uměl bych to napsat kratší, ale potom bych do každého adresáře musel tento soubor dávat - takhle stačí jen jeden. $pole[count($pole)] - to vadí hodně? Je to jen pro osobní použití a mně to rozhodně nevadí. Chvíli mi trvalo, co jsi myslel tím $ten_soubor :-D. OK, ale teď nechápu, kam si myslel dát to if(!in_array($ten_soubor, $ignored_file))?
Tori
Profil
Blitz:
$pole[count($pole)] - to vadí hodně?
No když předpokládáte, že by ten skript mohl běžet tak dlouho, že mu nastavujete timeout, tak by vám každé zdržení mělo vadit. ;) Funkce glob implicitně řadí výsledky, s ní by vám stačil jen jeden cyklus foreach.

Místo čtení globálních proměnných by šlo funkci upravit tak, aby dostala navíc jeden nepovinný parametr (ten $MAXTIME) a vracela true/false jako timeout.

kam dát to if(!in_array($ten_soubor, $ignored_file))?
Tak kde ukládáte názvy nalezených souborů.

Jozin:
Vrací to referencí.
Jozin
Profil
Tori:
Ano vrací to referenci, ale to mi příjde, jako zbytečné, přidávání parametrů... Ale to je individuální souhlasím, že tedy stačí reference.

Blitz:
Nějak nechápu jak ovlivní 2 cykly změní potřebu vkládání souboru s funkcí do jiného adresáře. Dá se to prostě zjednodušit/zrychlit.
Blitz
Profil *
Stejně mi to pořád nefungujue :-(. Kam přesně to mám dát?
Jozin
Profil
Tak jsem si dal tu práci a celou funkci přepsal, snad funguje jak má... zkoušel jsem ji jen na rychlo, protože na to nemám moc času, kdyby něco nefungovalo, stačí napsat:
<?php

function getDirArray($base_path, array $ignored_files = array(), $maxtime = 60, $start_time = 0)
{
  if(
    (!is_numeric($maxtime) || $maxtime <= 0) ||
    (!is_numeric($start_time) || $start_time < 0) ||
    (!is_dir($base_path))
    ) return false; //chybny vstup

  if($start_time == 0) $start_time = time();

  $ret = array();

  $handle=opendir($base_path);
  while($file = readdir($handle))
  {
    if($file == "." || $file == ".." || in_array($file, $ignored_files)) continue;
    $path = str_replace("//", "/", $base_path . '/' . $file);
    $dir    = is_dir($path);
    $ret[] = array(
      'path' => $path,
      'dir'  => $dir
    );
    if($dir == true) getDirArray($path, $maxtime, $start_time);
    if((time()-$start_time) > $maxtime) {
      $ret['time_over'] = true;
      return $ret;
    }
  }

  closedir($handle);
  return $ret;
}


výstupem je něco takového:
array(
  [0] => array(
    'path' => 'cesta_k_souboru',
    'dir'  => false
  ),
  [1] => array(
    'path' => 'cesta_k_podslozce',
    'dir'  => true
  ),
)


snad je to pochopitelné

EDIT: pokud příjde na timeover, tak se definuje v poli klíč 'time_over' s hodnotou true, takže to jednoduše ověříš if(isset($vystup['time_over'])) echo "Script přerušen.';

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0