Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Tiedostolistaus array_multisortilla

ajv [27.10.2004 23:45:35]

#

Tälläistä koodia ei täällä ennestään (tietääkseni) ole ja aina välillä tämä putkahtaa keskusteluissakin esiin. Päivittelin hieman vanhoja koodeja ja sain tämmöiset aikaiseksi.

Kyseessä on kaksi pientä esimerkkiä array_multisort()-funktion käyttömahdollisuuksista. Koodit ovat pohjimmiltaan samanlaisia, mutta sovelluskohde on eri. Ensimmäisessä koodissa listataan hakemiston tiedostot ruudulle siten, että käyttäjän on mahdollista järjestää tiedostot nimen, tyypin, koon tai muokkausajan mukaan joko laskevasti tai nousevasti.

Toisessa esimerkissä ruudulle listataan tiedoston sisältö samalla tyylillä. Data on tiedostossa eritelty |-merkillä.

Koodin nopeutta testasin sen verran että array_multisortin voi todeta olevan nopea. 10 000 tiedoston järjestämiseen kului aikaa 0.2 - 0.3 s. Sen sijaan 10 000:n tiedoston ja niiden oleellisten tietojen hakeminen taulukkoon kesti n. 15 sekuntia.

Ensimmäinen esimerkki listaa hakemiston tiedostot:
http://ajv.lautatarha.com/testing/list_dir.php
Toinen esimerkki listaa tiedoston sisällön (Enny keksiny parempaakaan tilastoo :P)
http://ajv.lautatarha.com/testing/list_file.php
Koska leiska sisältää myös kuvia, niin koko roska zippinä:
http://ajv.lautatarha.com/testing/list_dir.zip

Koodia saa(lue: pitää) muokata vapaasti. Jos et kuitenkaan halua muokata, niin olisi ehkä kohteliasta säilyttää myös linkki alareunassa.
P.S. Toimii myös esimerkkinä siitä, että vaikka HTML tuotetaan PHP:llä, saa HTML-koodistakin ihan siistin näköistä.

<?php

$dir_to_list = "roskakori";
$title = "Index of ".realpath($dir_to_list);
echo '<?xml version="1.0" encoding="iso-8859-1" ?>';
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Tiedostolistaus</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="list_dir.css" />
</head>
<body>
<div><span style="font: bold 1.5em verdana;"><?php echo $title; ?></span></div>
<?php
if(file_exists($dir_to_list)){

   //oletusarvot
   $sort = 1; $j = "ASC";
   //otetaan osoteriviltä listauksen järjestämiseen tarvittavat parametrit
   //ja tarkistetaan, että ne ovat oikeita
   if(isset($_GET['sort']) && $_GET['sort'] != ""){
      $sort = (int) $_GET['sort'];
      if($sort < 0 || $sort > 4) $sort = 1;
   }
   if(isset($_GET['j']) && $_GET['j'] != ""){
      $j = $_GET['j'];
      if($j != 'ASC' && $j != 'DESC') $j = 'ASC';
   }

   //käydään hakemiston tiedostot läpi ja otetaan niistä jotain tietoa
   //kaksiulotteiseen taulokkoon
   $i=0;
   foreach(glob("$dir_to_list/*.*") as $fname){
      $arr[$i][1] = $fname; //tiedostonimi
      $arr[$i][2] = filemtime($fname); //tiedoston muokkausaika
      $arr[$i][3] = filesize($fname); //tiedostokoko
      $arr[$i][4] = substr($fname,strrpos($fname,".")+1); //tiedoston pääte
      $i++;
   }

   //tehdään apu-taulukko varsinaista järjestämistä varten
   foreach ($arr as $key => $val){
      $apu[$key] = $val[$sort];
   }
   //järjestetään taulukko sen mukaan joka laskevasti tai nousevasti
   $j == "ASC" ? array_multisort($apu, SORT_ASC, $arr) : array_multisort($apu, SORT_DESC, $arr);
   //tulostetaan taulukon otsakerivi
   echo '<table cellpadding="0" cellspacing="0">
   <tr>
     <td class="a" align="left" width="45%"><b>Filename</b>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=1&j=ASC" title="Sort by name ascending">
     <img src="down.gif" width="10" border="0" height="10" alt="" /></a>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=1&j=DESC" title="Sort by name descending">
     <img src="up.gif" width="10" border="0" height="10" alt="" /></a></td>
     <td class="a" align="center" width="15%"><b>Type</b>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=4&j=ASC" title="Sort by type ascending">
     <img src="down.gif" width="10" border="0" height="10" alt="" /></a>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=4&j=DESC" title="Sort by type descending">
     <img src="up.gif" width="10" border="0" height="10" alt="" /></a></td>
     <td class="a" align="center" width="15%"><b>Size</b>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=3&j=ASC" title="Sort by size ascending">
     <img src="down.gif" width="10" border="0" height="10" alt="" /></a>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=3&j=DESC" title="Sort by size descending">
     <img src="up.gif" width="10" border="0" height="10" alt="" /></a></td>
     <td class="a" align="center" width="25%"><b>Modified</b>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=2&j=ASC" title="Sort by modify-time ascending">
     <img src="down.gif" width="10" border="0" height="10" alt="" /></a>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=2&j=DESC" title="Sort by modify-time descending">
     <img src="up.gif" width="10" border="0" height="10" alt="" /></a></td>
   </tr>';

   //tulostetaan lopputaulukko
   $i=0;
   foreach ($arr as $file => $d){
      $s = ($i++ % 2 == 1) ? "b" : "c"; //rivin tyylimääritys joka toisella eri
      echo '
   <tr>
     <td class="'.$s.'"><a href="'.$d[1].'">'.basename($d[1]).'</a></td>
     <td align="center" class="'.$s.'">'.$d[4].'</td>
     <td align="center" class="'.$s.'">'.byte2text($d[3]).'</td>
     <td align="center" class="'.$s.'">'.date("d.m.Y. H:i:s",$d[2]).'</td>
   </tr>';
   }
   echo "\n</table>";
}//end if(file_exists)

function byte2text($bytes){ //tavut tulostettavampaan muotoon
   $bytes = (int) $bytes;
   //palautetaan aina kahden desimaalin tarkkuudella
   if($bytes > 1048576) return sprintf(" %.2f",round($bytes/1048576,2))." Mt";
   if($bytes > 1024)    return sprintf(" %.2f",round($bytes/1024,2))." kt";
   //paitsi jo tiedostokoko on vain tavuja
   return $bytes." t";
}
?>

<div><a href="http://cgi.evtek.fi/~k0101030">Tiedostolistaus by ajv</a></div>
</body>
</html>
<?php


$db = "database.txt";
// Tiedostossa on dataa muodossa
// Valtio|Bushin saamat äänet|Kerryn saamat äänet|Bushin äänet prosentteina|Kerryn äänet prosentteina
// lähde: http://betavote.com/ (27.10.2004 22:30)
echo '<?xml version="1.0" encoding="iso-8859-1" ?>';
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Tiedostolistaus</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="list_dir.css" />
</head>
<body>
<div><span style="font: bold 1.4em verdana;">USA:n presidenttiehdokkaiden kannatus eri puolella maailmaa</span></div>
<?php
if(file_exists($db)){

   //oletusarvot
   $sort = 1; $j = "ASC";
   //otetaan osoteriviltä listauksen järjestämiseen tarvittavat parametrit
   //ja tarkistetaan, että ne ovat oikeita
   if(isset($_GET['sort']) && $_GET['sort'] != ""){
      $sort = (int) $_GET['sort'];
      if($sort < 0 || $sort > 5) $sort = 1;
   }
   if(isset($_GET['j']) && $_GET['j'] != ""){
      $j = $_GET['j'];
      if($j != 'ASC' && $j != 'DESC') $j = 'ASC';
   }

   $fp = fopen($db,"r");
   $i=0;
   while(!feof($fp)){
      $r = explode("|",trim(fgets($fp)));
      $arr[$i][1] = $r[0]; //valtio
      $arr[$i][2] = $r[1]; //Bushin äänet
      $arr[$i][3] = $r[2]; //Kerryn äänet
      $arr[$i][4] = $r[3]; //Bushin äänet prosentteina
      $arr[$i][5] = $r[4]; //Kerryn äänet prosentteina
      $i++;
   }

   //tehdään apu-taulukko varsinaista järjestämistä varten
   foreach ($arr as $key => $val){
      $apu[$key] = $val[$sort];
   }
   //järjestetään taulukko sen mukaan joka laskevasti tai nousevasti
   $j == "ASC" ? array_multisort($apu, SORT_ASC, $arr) : array_multisort($apu, SORT_DESC, $arr);

   //tulostetaan taulukon otsakerivi
   echo '<table cellpadding="0" cellspacing="0">
   <tr>
     <td class="a" width="20%"><b>Valtio</b>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=1&j=ASC" title="Sort ascending">
     <img src="down.gif" width="10" border="0" height="10" alt="" /></a>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=1&j=DESC" title="Sort descending">
     <img src="up.gif" width="10" border="0" height="10" alt="" /></a></td>
     <td align="center" class="a" width="20%"><b>Bush</b>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=2&j=ASC" title="Sort ascending">
     <img src="down.gif" width="10" border="0" height="10" alt="" /></a>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=2&j=DESC" title="Sort descending">
     <img src="up.gif" width="10" border="0" height="10" alt="" /></a></td>
     <td align="center" class="a" width="20%"><b>Kerry</b>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=3&j=ASC" title="Sort ascending">
     <img src="down.gif" width="10" border="0" height="10" alt="" /></a>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=3&j=DESC" title="Sort descending">
     <img src="up.gif" width="10" border="0" height="10" alt="" /></a></td>
     <td align="center" class="a" width="20%"><b>Bush %</b>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=4&j=ASC" title="Sort ascending">
     <img src="down.gif" width="10" border="0" height="10" alt="" /></a>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=4&j=DESC" title="Sort descending">
     <img src="up.gif" width="10" border="0" height="10" alt="" /></a></td>
     <td align="center" class="a" width="20%"><b>Kerry %</b>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=5&j=ASC" title="Sort ascending">
     <img src="down.gif" width="10" border="0" height="10" alt="" /></a>
     <a href="'.$_SERVER['PHP_SELF'].'?sort=5&j=DESC" title="Sort descending">
     <img src="up.gif" width="10" border="0" height="10" alt="" /></a></td>
   </tr>';

   $i=0;
   foreach ($arr as $file => $d){
      $s = ($i++ % 2 == 1) ? "b" : "c";
      echo '
   <tr>
     <td class="'.$s.'">'.$d[1].'</td>
     <td align="center" class="'.$s.'">'.$d[2].'</td>
     <td align="center" class="'.$s.'">'.$d[3].'</td>
     <td align="center" class="'.$s.'">'.$d[4].' %</td>
     <td align="center" class="'.$s.'">'.$d[5].' %</td>
   </tr>';
   }
   echo "\n</table>";
}//end if(file_exists)
?>

<div>Lähde: <a href="http://betavote.com/">http://betavote.com/ </a>(27.10.2004 22:30) <br />
<a href="http://cgi.evtek.fi/~k0101030">Tiedostolistaus by ajv</a></div>
</body>
</html>

list_dir.css

body{
   background-color:#4400FF;
   margin: 1em;
   text-align: center;
}
p{
   text-align:center;
}
table{
   margin: auto;
   width: 90%;
   text-align: left;
   border-top: 1px solid red;
   border-right: 1px solid red;
   font: 0.7em verdana;
   color: #FFFFFF;
}
div{
   margin: auto;
   padding: 0.2em 0em 0.2em 0em;
   text-align: left;
   width: 90%;
   color: #FFFFFF;
}
.a{
   background-color: #3333CC;;
   border-left: 1px solid red;
   border-bottom: 1px solid red;
   font: bold 1.1em verdana;
   padding: 1px 1px 1px 2px;
}
.b{
   background-color: #3366CC;
   border-left: 1px solid red;
   border-bottom: 1px solid red;
   padding: 1px 1px 1px 2px;
}
.c{
   background-color: #3366FF;
   border-left: 1px solid red;
   border-bottom: 1px solid red;
   padding: 1px 1px 1px 2px;
}
a:link{
   color: #FFFFFF;
   text-decoration: none;
}
a:visited{
   color: #FFFF00;
   text-decoration: none;
}
a:hover{
   color: red;
   text-decoration: none;
}
a:active{
   color: #FFFFFF;
   text-decoration: none;
}

Antti Laaksonen [28.10.2004 21:19:29]

#

Hyvät esimerkit. Listan järjestystä muuttavista nuolista voisi olla vielä eri värillä se, joka kuvaa listan senhetkistä järjestystä. Lisäksi ZIP-pakettiin on tainnut livahtaa pari ylimääräistä tiedostoa. :) (tai no, voivathan ne toimia testiaineistona...)

makeuu [28.10.2004 21:23:36]

#

Ohhoh.. ompas nopea :o

darkki [30.10.2004 12:28:54]

#

:) ainakin näyttää toimivan

Ape [14.11.2004 11:59:01]

#

Voisiko joku tehdä tästä version, jossa olisi sekaisin dir ja file sarakkeita. Minulla tuli hieman ongelmia. http://koti.mbnet.fi/apet/lataamo.php
Esim:
Tiedostonimi(dir): - Nimi(file): - Koko(dir):
tiedosto.txt - Tiedosto - 2.00 kt

ajv [14.11.2004 15:26:18]

#

Ape kirjoitti:

Voisiko joku tehdä tästä version, jossa olisi sekaisin dir ja file sarakkeita.

Vaikka ymmärtäisinkin kysymyksen, vastaus olisi silti ei. Koodivinkkien tarkoitus on se, että niistä opitaan jotakin, ei käyttää niitä suoraan, joten kotitehtäväksesi jää tehdä tuo itse.

Metabolix [10.12.2011 02:46:18]

#

Ei ole kovin validia eikä varsinkaan tyylikästä XHTML-koodia. Kuvien width, height ja border ovat rumia, tämä pitäisi tehdä CSS:llä (ja tekemällä tiedostoista valmiiksi halutun kokoisia). PHP_SELF-arvon käyttö on täysin turhaa ja lisäksi XSS-riski.

Hyvä esimerkki järjestelyfunktioista olisi kyllä tarpeen. :(

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta