Autor Zpráva
johnl
Profil
Dobrý den chtěl bych se zeptat zda je možné když budu vypisovat soubory z adresáře např.

1$slozka = dir("./");
2while($file=$slozka->read()) {
3  if ($file=="." || $file=="..") continue;
4  $pole = explode("<!+!>", file_get_contents("./".$file.""));
5  echo "Soubor ".$file." má speciální číslo "$pole[2]"";
6}
7$slozka->close();
$slozka = dir("./");
while($file=$slozka->read()) {
  if ($file=="." || $file==".."continue;
  $pole explode("<!+!>"file_get_contents("./".$file.""));
  echo "Soubor ".$file." má speciální číslo "$pole[2]"";
}
$slozka->close();


tak je řadit nějakým zvláštním způsobem, např. že proměná $pole[2] bude obsahovat číslo a soubory se budou řadit podle toho ve kterém souboru je toto číslo největší - takže soubory které toto číslo budou mít největší budou nahoře a soubory s nejnišším dole.

Vůbec nevím jestli to jde udělat proto budu rád za každou radu - pokud to jde ;-)
Radek9
Profil
johnl:
1$array = array();
2...
3$array[$pole[2]] = $file;
4...
5arsort($array);
$array array();
...
$array[$pole[2]] = $file;
...
arsort($array);

Popřípadě si to nějak uprav, pokud je více stejných čísel.

Teď mě ještě napadlo:
1$array = array();
2...
3$array[$file] = $pole[2];
4...
5asort($array);
6...
7foreach($array as $key => $val){
8  echo $key;//vypíše název souboru.
9}
$array array();
...
$array[$file] = $pole[2];
...
asort($array);
...
foreach($array as $key => $val){
  echo $key;//vypíše název souboru.
}
Majkl578
Profil
Jít by to mělo, prvně se načtou do pole, to se poté seřadí a nakonec vypíše.
Raději než dir využívám DirectoryIterator, než explode bych raději regexp, popř. něco hezčího.

Zkus tedy toto, nevím ale jak dobře ti to bude fungovat, neotestoval jsem celé, neměl jsem na čem. :)
1$dir = new DirectoryIterator(dirname(__FILE__));
2$files = array();
3while ($dir->valid()) {
4    if (!$dir->isDot() && $dir->isFile()) { //pokud je polozka soubor
5        preg_match('~.*\<\!\+\!\>.*\<\!\+\!\>(.*)\<\!\+\!\>.*~U', file_get_contents($dir->getFilename()), $matches);
6        if (isset($matches[0])) {//pokud existuje udaj o pozici
7            $files[$matches[0]] = $dir->getFilename();
8        }
9    }
10    
11    $dir->next();//posune se na dalsi soubor
12}
13 
14sort($files);//seradit soubory
15$files = array_reverse($files);//otocit poradi - od nejvetsiho
16 
17foreach ($files as $identifier => $file) {
18    'Soubor "' . $file . '" má speciální číslo "' . $identifier . '"' . "\n";
19}
$dir new DirectoryIterator(dirname(__FILE__));
$files array();
while ($dir->valid()) {
    if (!$dir->isDot() && $dir->isFile()) { //pokud je polozka soubor
        preg_match('~.*\<\!\+\!\>.*\<\!\+\!\>(.*)\<\!\+\!\>.*~U'file_get_contents($dir->getFilename()), $matches);
        if (isset($matches[0])) {//pokud existuje udaj o pozici
            $files[$matches[0]] = $dir->getFilename();
        }
    }
    
    $dir->next();//posune se na dalsi soubor
}
 
sort($files);//seradit soubory
$files array_reverse($files);//otocit poradi - od nejvetsiho
 
foreach ($files as $identifier => $file) {
    'Soubor "' . $file '" má speciální číslo "' . $identifier '"' . "\n";
}
johnl
Profil
Majkl578:
Vyzkoušel jsem to a skončilo to chybou
Warning: file_get_contents(slozka) [function.file-get-contents]: failed to open stream: Permission denied in C:\xampp\htdocs\*****\***\index.php on line 6

Řádek 6
preg_match('~.*\<\!\+\!\>.*\<\!\+\!\>(.*)\<\!\+\!\>.*~U', file_get_contents($dir->getFilename()), $pole); 
preg_match('~.*\<\!\+\!\>.*\<\!\+\!\>(.*)\<\!\+\!\>.*~U'file_get_contents($dir->getFilename()), $pole); 


Jak to můžu opravit?
Majkl578
Profil
Juj, spletl jsem tam negaci při přepisu podmínky. Teď by to mělo jít.
johnl
Profil
Teď když jsem to poupravil tak to vypisuje soubory z adresáře ./ (tam ten script je) ale měl by vypisovat z adresáře slozka/ - pokud se nepletu?

1$dir = new DirectoryIterator(dirname("slozka/"));
2$files = array();
3while ($dir->valid()) {
4    if (!$dir->isDot() && $dir->isFile()) { //pokud je polozka soubor
5        $matches = explode("<!+!>", file_get_contents($dir->getFilename()));
6        $files[$matches[17]] = $dir->getFilename();
7    }
8    
9    $dir->next();//posune se na dalsi soubor
10}
11 
12sort($files);//seradit soubory
13$files = array_reverse($files);//otocit poradi - od nejvetsiho
14 
15foreach ($files as $identifier => $file) {
16   echo "$file" . "\n";
17}
$dir new DirectoryIterator(dirname("slozka/"));
$files array();
while ($dir->valid()) {
    if (!$dir->isDot() && $dir->isFile()) { //pokud je polozka soubor
        $matches explode("<!+!>"file_get_contents($dir->getFilename()));
        $files[$matches[17]] = $dir->getFilename();
    }
    
    $dir->next();//posune se na dalsi soubor
}
 
sort($files);//seradit soubory
$files array_reverse($files);//otocit poradi - od nejvetsiho
 
foreach ($files as $identifier => $file) {
   echo "$file" . "\n";
}
Majkl578
Profil
To dirname tam nemá co dělat. DirectoryIterator bere argument složku.
new DirectoryIterator('./slozka/');
new DirectoryIterator('./slozka/');
johnl
Profil
Tak když už to konečtně funguje - v této podobě
1$dir = new DirectoryIterator("slozka/");
2$files = array();
3while ($dir->valid()) {
4    if (!$dir->isDot() && $dir->isFile()) { //pokud je polozka soubor
5        $matches = explode("<!+!>", file_get_contents("slozka/".$dir->getFilename().""));
6        $files[$matches[17]] = $dir->getFilename();
7    }
8    
9    $dir->next();//posune se na dalsi soubor
10}
11 
12sort($files);//seradit soubory
13$files = array_reverse($files);//otocit poradi - od nejvetsiho
14 
15foreach ($files as $identifier => $file) {
16   echo "$file" . "\n";
17}
$dir new DirectoryIterator("slozka/");
$files array();
while ($dir->valid()) {
    if (!$dir->isDot() && $dir->isFile()) { //pokud je polozka soubor
        $matches explode("<!+!>"file_get_contents("slozka/".$dir->getFilename().""));
        $files[$matches[17]] = $dir->getFilename();
    }
    
    $dir->next();//posune se na dalsi soubor
}
 
sort($files);//seradit soubory
$files array_reverse($files);//otocit poradi - od nejvetsiho
 
foreach ($files as $identifier => $file) {
   echo "$file" . "\n";
}

Tak to stejně nefunguje protože se stane to že všechny souboru mají to číslo úplně stejné - podle toho prvního souboru.. :(
Majkl578
Profil
[#8] johnl
Aha, já počítal s tím, že každý soubor má unikátní hodnotu.

Zkus toto:
1$dir = new DirectoryIterator($path = './slozka/');
2$files = array();
3while ($dir->valid()) {
4    if (!$dir->isDot() && $dir->isFile()) { //pokud je polozka soubor
5        $matches = explode("<!+!>", file_get_contents($path . $dir->getFilename()));
6        $files[$dir->getFilename()] = $matches[17];
7    }
8    $dir->next();//posune se na dalsi soubor
9}
10 
11uasort($files, 'usortCb');//seradit soubory
12 
13foreach ($files as $file => $id) {
14   echo "$id > $file" . "\n";
15}
16 
17function usortCb($a, $b)
18{
19    return $a == $b ? 0 : ($a > $b ? -1 : 1);
20}
$dir new DirectoryIterator($path './slozka/');
$files array();
while ($dir->valid()) {
    if (!$dir->isDot() && $dir->isFile()) { //pokud je polozka soubor
        $matches explode("<!+!>"file_get_contents($path $dir->getFilename()));
        $files[$dir->getFilename()] = $matches[17];
    }
    $dir->next();//posune se na dalsi soubor
}
 
uasort($files'usortCb');//seradit soubory
 
foreach ($files as $file => $id) {
   echo "$id $file" . "\n";
}
 
function usortCb($a$b)
{
    return $a == $b 0 : ($a $b ? -1 : 1);
}


Případně zkus lépe popsat problém - jaká situace nastává / může nastat.
johnl
Profil
[#9] Majkl578
Už to funguje tak jak má - Děkuju za pomoc ;-)
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.

Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:


Běda vám, jestli to bude blábol.

0