Autor | Zpráva | ||
---|---|---|---|
TrueFriend Profil |
#1 · Zasláno: 21. 9. 2010, 18:31:23
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 |
#2 · Zasláno: 21. 9. 2010, 18:52:36
TrueFriend: $soubory je dvojrozmerné pole, $a iba jednorozmerné.
if (strpos($hodnota['name'], "foto") !== false) |
||
TrueFriend Profil |
#3 · Zasláno: 21. 9. 2010, 19:06:03
Díky, to funguje. Nechápu jak jsem to vůbec mohl přehlédnout.
|
||
TrueFriend Profil |
#4 · Zasláno: 21. 9. 2010, 20:48:53
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 |
#5 · Zasláno: 21. 9. 2010, 20:52:00
TrueFriend:
if (empty($soubory) {} třeba takhle? |
||
tiso Profil |
#6 · Zasláno: 21. 9. 2010, 20:53:16 · Upravil/a: tiso
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 |
#7 · Zasláno: 21. 9. 2010, 21:13:15
Funguje. Díky. Dost dobré řešení.
|
||
Majkl578 Profil |
#8 · Zasláno: 22. 9. 2010, 00:35:44 · Upravil/a: Majkl578
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 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. :) |
||
Časová prodleva: 14 let
|
0