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

$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:
$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:
$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. :)
$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); 


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?

$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/');
johnl
Profil
Tak když už to konečtně funguje - v této podobě
$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:
$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 ;-)

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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