2011-04-15 17 views
1

私はディレクトリからファイルを集めて配列に格納する関数を持っています。PHPで同じ機能と効率を再利用

function getFiles($folder){ 
    $ignore = array("index.php",".","..","favicon.gif","favicon.ico",".DS_Store"); 
    $gottenFiles = array(); 
     if ($handle = opendir($folder)) {  
      while (false !== ($file = readdir($handle))) { 
       if (in_array($file, $ignore)){ 
        //do nothing 
       }else{ 
        array_push($gottenFiles, $file); 
       } 
      } 
     closedir($handle); 
     } 
    return $gottenFiles; 
} 

私が頭を包んでいる問題は、効率の問題です。 私は毎回getFiles("folder");を実行します。これは、アレイを再アセンブリする全プロセスを実行します。私は、静的変数と処理条件なしで、少しずつ手を加えました。変数$filesArray = getFiles("folder");の中の関数を呼び出して、再利用$filesArrayを使用する方が良いでしょうか。

彼らは一度アレイを設定し、opendirを続行しないのですか?

私は上記の機能に変更できますか? (//何も条件なし?)

ありがとうございます!

答えて

2

関数内に静的変数を定義すると、この変数はこの関数の複数の呼び出しにまたがって値を保持します。

だから、あなたはこれを行うことができます:あなたが同じフォルダに、この関数を複数回実行する場合は、「仕事をしている」という文字列は初回のみが表示されます

function getFiles($folder) 
{ 
    static $cache = array(); 

    if (isset($cache[$folder])) 
    { 
     return $cache[$folder]; 
    } 

    $ignore = array("index.php",".","..","favicon.gif","favicon.ico",".DS_Store"); 

    echo "doing the job\n"; // Don't forget to remove 

    $gottenFiles = array(); 
    if ($handle = opendir($folder)) 
    { 
     while (false !== ($file = readdir($handle))) 
     { 
      if (in_array($file, $ignore)) 
      { 
       //do nothing 
      } 
      else 
      { 
       array_push($gottenFiles, $file); 
      } 
     } 

     closedir($handle); 
    } 

    $cache[$folder] = $gottenFiles; 

    return $gottenFiles; 
} 

を。 echoステートメントを削除することを忘れないでください;)

+0

かなりクール。 $ cache [$ folder]はどのように機能しますか?私はあなたが配列のスロットを参照するためにそこに数値を入れることしかできないと思った。 – ThomasReggi

+0

文字列と整数を配列のキーとして使用することもできます。 $ arr = array(0 => 'a'、 'test' => 'b');働く'a'を得るには$ arr [0]を使います。 'b'を得るには:$ arr ['test']。私たちの場合、$ folderは文字列なので、他の文字列のように動作します。配列に関するすべての情報を得ることができます(ドキュメント内)(http://www.php.net/manual/en/language.types.array.php) –

3

値があまり変更されない場合(スクリプトの実行中にファイルを追加していない場合)、パフォーマンスの問題が発生している場合は、結果を配列に格納することは非常に良い考えです。

スクリプトを実行している間にデータが変更されている場合は、スクリプトを再実行して新しい情報を取得する必要があります。

ただし、パフォーマンスの問題が見られない場合は、時期尚早の最適化となる可能性があります。

しかし、変数に値をキャッシュするのは簡単な解決策であり、問​​題を解決するはずです。

関連する問題