fortune class

obdoba linuxového fortune

před pár dny byla na server phpclasses.org přidána třída php5 fortune class. tato třída generuje ze souborů používaných linuxovým programem fortune náhodně vybrané citáty. jak je zřejmé už z názvu třídy, je tato napsána pro php5. jelikož jsem chtěl tuto třídu použít na svých stránkách, ale bohužel na stroji, kde je můj web umístěn, běží php v nižší verzi. proto jsem tuto třídu upravil tak aby fungovala i na nižších verzích php.

soubor fortune.class.php: <?PHP
  
class fortune{

  
// adresar, kde jsou ulozene soubory s citaty
  
var $datadir

    
// overi zda soubor ma priponu .fortune
  
function IsFortuneFile($file){ 
        if (
ereg('\.fortune$',$file)){
            return 
true;
        }else{
            return 
false;
        }
    }
  
  
// ulozeni ukazatelu na zacatky citatu do pole
  
function IndexFile($file){ 
        
$index = array();
        
$soubor fopen($file,'r');
        while (!
feof($soubor)) {
            
$line fgets($soubor,4096);
            if (
$line == "%\n"  or $line == "%\r\n") {
                
$index[] = ftell($soubor);
            }
        }
        
fclose($soubor);
        return 
$index;
    }

    
// vrati nahodnou hodnotu do zadane $max hodnoty
  
function RandPick($max){ 
        list(
$usec$sec) = explode(' 'microtime());
        
$seed = (float) $sec + ((float) $usec 100000);
        
srand($seed);
        
$num rand(0,$max);
        return 
$num;
    }

    
// ze souboru $file vybere citat urceny ukazatelem ulozenem v poli $pole na pozici $num
  
function FetchQuoteInFile ($file $pole $num){ 
        
$soubor fopen($file,'r');
        if (
$num 0) {
      
fseek($soubor,$pole[$num-1]);
    }
        
$quote '';
        while (
$line fgets($soubor4096)) {
            if (
$line == "%\n" or $line == "%\r\n") {
                break;
            }
            
$quote .= $line;
        }
  
fclose($soubor);
  return 
$quote;
    }
  
    
// hlavni funkce 
  
function Get_Quote(){
        
$soubory = array();
        
$files = array();
        if (
$soubor dir($this->datadir)){
          
$i=0;
            while (
$file $soubor->read()){
                if(
$this->isFortuneFile($file)){
                    
$soubory[] = $this->indexFile($this->datadir.'/'.$file);
                    
$files[] = $this->datadir."/".$file;
                    
$i++;
                }
            }
            
$soubor->close();
        }
            for(
$i=0$i<Count($soubory); $i++){
                
$tot_quotes += count($soubory[$i])+1;
            }
            
$pick $this->RandPick($tot_quotes-1);
      
$q=0;
            for(
$i=0$i<Count($soubory); $i++){
                
$in_file count($soubory[$i])+1;
                
$max $in_file $q;
                if (
$pick >= $i and $pick $max) {
                    
$quote $this->FetchQuoteInFile($files[$i],$soubory[$i],$pick-$q);
                    break;
                }
                
$q += $in_file;
            }
            return 
$quote;
    }
    
    
// vola hlavni funkci dokud neni vracen citat 
    
function Quote(){
    while(!
$quote){
      
$quote=$this->Get_Quote();
    }
    return 
$quote;
  }
}
?>

soubor index.php: <?PHP
  
// natazeni knihovny obsahujici tridu
  
include ("class.fortune.php");
  
// vytvoreni instance tridy
  
$fortune=new fortune;
  
// nastaveni adresare se soubory obsahujici citaty
  
$fortune->datadir="fortunes";
  
// vypis citatu
  
echo NL2BR($fortune->quote());
?>

jak třída funguje, se můžeš podívat tady: furtune demo

tento příklad si můžeš stáhnou a vyzkoušet na svém serveru drsny.zip

na třídu php5 forune class se můžeš podívat tady