Autor Zpráva
TrueFriend
Profil
Zdravím vás. Trápím se s jednou částí scriptu, který načte soubory v adresáři do pole a vypíše názvy souborů. Problém nastane, když chci omezit výpis jen na soubory obsahující zadané znaky.

Funkční script vypisující seznam souborů:

$path_files .= "/";
$dir = opendir($path_files);
$soubory = array();
while (($soubor = readdir($dir)) !== false)  if ($soubor != '.' and $soubor != '..' and $soubor != '.htaccess' and $soubor != '.ftpaccess') $soubory[] = array(
	'name' => $soubor,
	'date' => filemtime($path_files . $soubor),
	'size' => filesize($path_files . $soubor)
	);
closedir($dir);

foreach ($soubory as $soubor) {
echo $soubor['name']."<br>";
}



když ho ale upravím takto tak nic nenačte:

$path_files .= "/";
$dir = opendir($path_files);
$soubory = array();
while (($soubor = readdir($dir)) !== false)  if ($soubor != '.' and $soubor != '..' and $soubor != '.htaccess' and $soubor != '.ftpaccess') $soubory[] = array(
	'name' => $soubor,
	'date' => filemtime($path_files . $soubor),
	'size' => filesize($path_files . $soubor)
	);
closedir($dir);

foreach ($soubory as $keys => $hodnota) {
   if (strpos($hodnota, "foto") !== false)
   {
       echo $hodnota."<br>";
   }
};



přitom s pevně zadanými poli funguje:

$a = array(
	'name' => asdfg,
	'date' => gfdsa,
	'size' => rewrer,
	'oro' => package
);

foreach ($a as $keys => $item) {
    if (strpos($item, 'fds') !== false) {
        echo "match: ".$keys." - ".$item."<br>";
    }
}


poradil by někdo kde by mohla být chyba?
tiso
Profil
TrueFriend: $soubory je dvojrozmerné pole, $a iba jednorozmerné.
if (strpos($hodnota['name'], "foto") !== false)
TrueFriend
Profil
Díky, to funguje. Nechápu jak jsem to vůbec mohl přehlédnout.
TrueFriend
Profil
Ještě bych se chtěl zeptat.
Jak udělám, aby když nic nenajde napsal, že nic nenašel?
Zkoušel jsem to udělat takto ale je to problém:

foreach ($soubory as $keys => $soubory) {

   if (strpos($soubory['name'], $searchname) !== false) {
       echo $soubory['name']."<br>";
   }else{
   echo "sry<br>";
   break;
   }
panther
Profil
TrueFriend:
if (empty($soubory) {}

třeba takhle?
tiso
Profil
TrueFriend:
$found=false;
foreach ($soubory as $keys => $soubory) {

   if (strpos($soubory['name'], $searchname) !== false) {
       echo $soubory['name']."<br>";
       $found=true;
   }
}
if (!$found){echo "sorry<br>";}
TrueFriend
Profil
Funguje. Díky. Dost dobré řešení.
Majkl578
Profil
Sice opožděně, ale dovolím si nabídnout elegantnější, objektové řešení pomocí iterátorů DirectoryIterator a RegexIterator:

$iterator = new RegexIterator(new DirectoryIterator('/foo/bar'), '~^x~'); // filtrování ve složce /foo/bar na základě PCRE regulárního výrazu pro název souboru/složky

if (iterator_count($iterator)) { // pokud existuje alespoň 1 záznam
    foreach ($iterator as $item) { //procházení
        if ($item->isDot() || $item->getFilename() === '.htaccess' || $item->getFilename() === '.ftpaccess') continue; //přeskočit ., .. a ty 2 soubory
        echo $item->getFilename(), "\n";
    }
} else { // pokud neexistuje nic
    echo 'Nenalezeny žádné položky';
}




S Alphardem jsme spekulovali o rychlosti jednotlivých scriptů, udělal jsem tedy takový primitivní benchmark.
Provedl jsem ho na pár let starém notebooku, dvoujádrový athlon, 5400RPM disk, Debian s ext4.

Složka /tmp/test obsahovala 100 tisíc souborů vytvořených tímto cyklem:
$r = range('a', 'z');
$c = count($r);
for ($i=1; $i <= 100000; $i++) {
    touch('/tmp/test/' . $i . $r[rand(0, $c - 1)]);
}

Tvoje verze (upravená pro potřeby testu):
Výsledky šesti po sobě jdoucích měření:
1.7303199768066
1.6659321784973
1.760302066803
1.8163421154022
1.7651901245117
1.6844129562378
(Při odkomentovaných funkcích filemtime a filesize byly časy zhruba dvojnásobné.)

Moje verze (upravená pro potřeby testu):
Výsledky šesti po sobě jdoucích měření:
0.65627503395081
0.93173694610596
0.78416705131531
0.90221095085144
0.74651193618774
0.83505511283875

Závěr nechť si každý udělá sám. :)

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