ホームページ >バックエンド開発 >PHPチュートリアル >PHP が反復を使用してフォルダーのコピー、削除、サイズを表示する方法の分析例

PHP が反復を使用してフォルダーのコピー、削除、サイズを表示する方法の分析例

黄舟
黄舟オリジナル
2017-08-11 13:15:431195ブラウズ

この記事では、主に、反復に基づいてフォルダーのコピー、削除、サイズの確認などの操作を実現するための PHP の方法を紹介します。反復の原理を簡単に説明し、フォルダーのコピー、削除、サイズの確認を実現するための反復アルゴリズムの使用方法を分析します。一般的な操作の関連実装スキルについては、必要な友人が参照できるようにします

この記事では、PHP が反復に基づいてフォルダーのコピー、削除、サイズ表示などの操作を実装する方法について説明します。参考までに皆さんと共有してください。詳細は次のとおりです。

前回の記事 PHP はフォルダーのコピー、削除、サイズ表示の操作を再帰的に実装します。 ここでは、反復の操作テクニックを分析してみます。 。

「再帰でうまく解決できるのに、なぜ反復を使うのですか?」主な理由は効率の問題です...

再帰の概念は、関数自体を呼び出して、複雑な問題を複数の類似したサブ問題に分解して解決することです。これにより、コードの量が大幅に削減され、プログラムが非常にエレガントに見えるようになります。 。

システムは関数呼び出しごとに実行領域を割り当て、スタックプッシュを使用してそれを記録するためです。関数呼び出しが終了した後、システムはスペースを解放し、スタックをポップしてブレークポイントを復元する必要があります。したがって、再帰のコストは依然として比較的大きいです。

たとえ言語設計が関数呼び出しを完全に最適化しており、再帰によって引き起こされるリソースの無駄が無視できる場合でも、再帰の深さは依然としてシステムのスタック容量によって制限され、そうでない場合は StackOverflowError がスローされます。

そして、繰り返し処理に適したコンピュータの特性をうまく利用できるのが反復であり、理論的にはすべての再帰関数を反復関数に変換できるので、再帰なしでできる場合はiteration replaceを使います。

フォルダーのサイズを表示

反復の考え方は、コンピューターに一連の命令を繰り返し実行させることです。この一連の命令が実行されるたびに、他の新しい値が元の値から導出されます。変数の... これを繰り返します。 終了条件に達するか、新しい値が生成されなくなるまで、プロセスが継続されます。

再帰はループとスタックに相当するため、スタックを反復で使用して再帰と反復を変換できます。


/**
 * 文件夹大小
 * @param $path
 * @return int
 */
function dirsize($path)
{
  /* 初始条件 */
  $size = 0;
  $stack = array();
  if (file_exists($path)) {
    $path = realpath($path) . '/';
    array_push($stack, '');
  } else {
    return -1;
  }
  /* 迭代条件 */
  while (count($stack) !== 0) {
    $dir = array_pop($stack);
    $handle = opendir($path . $dir);
    /* 执行过程 */
    while (($item = readdir($handle)) !== false) {
      if ($item == '.' || $item == '..') continue;
      $_path = $path . $dir . $item;
      if (is_file($_path)) $size += filesize($_path);
      /* 更新条件 */
      if (is_dir($_path)) array_push($stack, $dir . $item . '/');
    }
    closedir($handle);
  }
  return $size;
}

フォルダをコピー

反復も再帰も、変数の初期化、終了条件の判断、実際の操作の実行、新しい変数の生成という4つのステップがありますが、場所が異なります。

たとえば、変数を初期化するステップは反復では関数の先頭にありますが、再帰では他の関数にパラメータを渡すプロセスを指します

終了条件を判断するステップは反復で使用されます。再帰の終了位置を決定するために再帰で使用されるループ Continue かどうかを判断します。

新しい変数を生成するステップの前に、実際の操作を実行することが再帰と反復の両方において関数の中心部分です。は反復の継続の条件です。再帰では、次の再帰の基礎となり、新しい変数の生成により再帰または反復が継続します。

/**
 * 复制文件夹
 * @param $source
 * @param $dest
 * @return string
 */
function copydir($source, $dest)
{
  /* 初始条件 */
  $stack = array();
  $target = '';
  if (file_exists($source)) {
    if (!file_exists($dest)) mkdir($dest);
    $source = realpath($source) . '/';
    $dest = realpath($dest) . '/';
    $target = realpath($dest);
    array_push($stack, '');
  }
  /* 迭代条件 */
  while (count($stack) !== 0) {
    $dir = array_pop($stack);
    $handle = opendir($source . $dir);
    if (!file_exists($dest . $dir)) mkdir($dest . $dir);
    /* 执行过程 */
    while (($item = readdir($handle)) !== false) {
      if ($item == '.' || $item == '..') continue;
      $_source = $source . $dir . $item;
      $_dest = $dest . $dir . $item;
      if (is_file($_source)) copy($_source, $_dest);
      /* 更新条件 */
      if (is_dir($_source)) array_push($stack, $dir . $item . '/');
    }
    closedir($handle);
  }
  return $target;
}

フォルダーを削除します 言語機能はさておき、パフォーマンスに最も影響を与えるのは、通常、不適切な設計によって引き起こされる冗長コードです。

ほとんどの場合、再帰には反復よりも冗長なコードが含まれます。これも再帰の効率が低い主な要因です。

しかし、再帰コードが十分に簡潔で、冗長性が十分に低い場合、反復のパフォーマンスは再帰のパフォーマンスより高くない可能性があります。

たとえば、反復を使用して実装されたこのフォルダー削除関数は、再帰よりも 20% 遅くなります。主な理由は、再帰ではフォルダーにサブフォルダーがない場合、すべてのファイルと現在のフォルダーを直接削除するためです。再帰が終了します。

反復中にフォルダーが空であっても、削除する前に次の反復でフォルダーが空であるかどうかを判断してスタックに保存する必要があります。再帰に比べて、ファイルが空であると判断してスタックに格納し、反復を取り出すなどの冗長な操作が多いため、処理速度は再帰より遅くなります。

/**
 * 删除文件夹
 * @param $path
 * @return bool
 */
function rmdirs($path)
{
  /* 初始化条件 */
  $stack = array();
  if (!file_exists($path)) return false;
  $path = realpath($path) . '/';
  array_push($stack, '');
  /* 迭代条件 */
  while (count($stack) !== 0) {
    $dir = end($stack);
    $items = scandir($path . $dir);
    /* 执行过程 */
    if (count($items) === 2) {
      rmdir($path . $dir);
      array_pop($stack);
      continue;
    }
    /* 执行过程 */
    foreach ($items as $item) {
      if ($item == '.' || $item == '..') continue;
      $_path = $path . $dir . $item;
      if (is_file($_path)) unlink($_path);
      /* 更新条件 */
      if (is_dir($_path)) array_push($stack, $dir . $item . '/');
    }
  }
  return !(file_exists($path));
}

実行時間の表示これは、コードの実行時間(ミリ秒)を表示し、コールバックを通じて対象のコード(または関数)を実行し、最終的に実行時間(ミリ秒)を計算する関数です。このツールを使用すると、機能間のパフォーマンスの差を比較できます。非常にシンプルで実用的なツールです。

りー

以上がPHP が反復を使用してフォルダーのコピー、削除、サイズを表示する方法の分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。